當日志訊息未顯示在類方法的控制臺輸出中時,我花了幾個小時來除錯問題,該方法通過 NUnit TestCaseSource呼叫。
所以我有一個類,我在其中執行日志記錄以進行除錯。
public class TestHelper
{
private readonly Logger logger;
public TestHelper()
{
logger = LogManager.GetCurrentClassLogger();
}
public IEnumerable<int> GetTestData()
{
List<int> testData = new();
for (var i = 0; i < 10; i )
{
logger.Info("This message is ignored when is called from NUnit test data provider {i}", i);
testData.Add(i);
}
return testData;
}
}
我有一個測驗夾具:
public class DemoTestFixture
{
private static readonly ClassWithLoggingInside ClassWithLoggingInside = new();
private static readonly TestHelper TestHelper = new();
private readonly Logger logger = LogManager.GetCurrentClassLogger();
[Test]
[TestCaseSource(nameof(GetTestData))]
public void LoggingFromTestDataSourceIsIgnored(int i)
{
Assert.DoesNotThrow(() => ClassWithLoggingInside.Log());
logger.Debug("Message from test fixture {i}", i);
}
[Test]
public void LoggingIsShown()
{
Assert.DoesNotThrow(() => TestHelper.GetTestData());
}
private static IEnumerable<int> GetTestData()
{
IEnumerable<int> testData = TestHelper.GetTestData();
foreach (int i in testData) yield return i;
}
}
當從引數化測驗中呼叫TestHelper.GetTestData()時,不會顯示該方法的控制臺輸出,但是,訊息會記錄到檔案中。當該方法不作為測驗資料提供者的一部分被呼叫時 - 訊息會完美地記錄到控制臺目標中。
我正在使用最新的 NLog 記錄器、.NET5、最新的 NUnit。使用 log4net 記錄器嘗試了以下操作 - 結果相同。使用 Resharper/dotnet test 命令運行測驗。
我懷疑問題出在靜態初始化的某個地方,但無法理解為什么檔案目標日志記錄作業正常并且控制臺輸出存在問題。你有什么解釋嗎?
可以在此處找到演示專案。
uj5u.com熱心網友回復:
答案相對簡單,但可能對您沒有幫助。:-(
您在控制臺執行的任何日志記錄都出現在 NUnit 輸出中的原因是 NUnit在運行測驗時捕獲控制臺輸出。
但是,在 NUnit 運行測驗時不會執行測驗用例源,而是在它發現測驗時執行。發現在開始執行測驗之前已經發生了很長時間(在計算機時間中)。
我懷疑這會變得更加混亂,因為我們允許您將資料源與測驗本身放在同一個類中,盡管它也可能在一個單獨的類中。然而,該靜態方法的執行不是運行測驗的一部分。事實上,只有在運行該方法之后,NUnit 才知道有多少測驗。
如果您需要 NUnit 捕獲并顯示記錄的輸出,則必須在測驗方法本身或設定或拆卸方法之一中完成。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/370989.html
上一篇:測驗Jest和NestJs
