控制台目标日志记录不适用于 NUnit 测试用例源提供程序中调用的方法
Posted
技术标签:
【中文标题】控制台目标日志记录不适用于 NUnit 测试用例源提供程序中调用的方法【英文标题】:Console target logging does not work for methods called within NUnit test case source provider 【发布时间】:2022-01-06 15:37:48 【问题描述】:当通过 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 命令运行测试。
我怀疑问题出在 static 初始化的某个地方,但不明白为什么文件目标日志记录工作正常并且控制台输出存在问题。你有什么解释吗?
演示项目可以在here找到。
【问题讨论】:
【参考方案1】:答案相对简单,但可能对您没有帮助。 :-(
您在控制台执行的任何日志记录都出现在 NUnit 输出中的原因是 NUnit 在运行测试时捕获控制台输出。
但是,您的测试用例源代码不会在 NUnit 运行测试时执行,而是在它发现测试时执行。发现在开始测试执行之前发生了很长时间(以计算机时间计)。
我怀疑这会更加令人困惑,因为我们允许您将数据源与测试本身放在同一个类中,尽管它也可能位于一个单独的类中。然而,该静态方法的执行不是运行测试的一部分。事实上,只有在该方法运行之后,NUnit 才知道有多少测试。
如果您需要 NUnit 捕获和显示您的日志输出,则必须在测试方法本身或设置或拆卸方法之一中完成。
【讨论】:
谢谢你的解释,有道理。以上是关于控制台目标日志记录不适用于 NUnit 测试用例源提供程序中调用的方法的主要内容,如果未能解决你的问题,请参考以下文章
Jenkins iOS 作业中断,因为“致命:日志语句不同步:当前测试用例为空”