为什么NUnit不显示后台线程的控制台输出?

时间:2017-10-27 11:00:47

标签: c# multithreading console nunit

我的库有一些后台线程,它们将调试输出打印到Console.WriteLine()。在第一次测试中,我可以在测试输出中看到来自后台线程的调试行。但接下来的测试不再显示此输出。

如果我在测试方法self中调用Console.WriteLine(),那么这将在测试输出中看到。我已经调试它和测试调用

  • 测试中的第一个Console.WriteLine()
  • 然后在后台测试中调用Console.WriteLine()
  • 最后再次在测试中调用Console.WriteLine()。

但我只看到测试的输出而不是后台线程的输出。

看起来NUnit已经将捕获范围保存在线程上下文中。

如何从所有后台线程获取控制台输出?

2 个答案:

答案 0 :(得分:2)

因为我们的库可以选择重定向日志输出,所以我们可以在测试中进行以下操作:

    [SetUp]
    public void FixtureSetUp()
    {
        MyLibrary.Console = TestContext.Out;
    }

这不是一个好的解决方案。

答案 1 :(得分:0)

这取决于您正在使用的NUnit框架的特定运行时构建。有关文本捕获的信息在NUnit的TestExecutionContext中维护,在不同的版本中以不同方式存储。

对于所有桌面版本(.NET 2.0,3.5,4.0和4.5),当前TestExecutionContext保留在CallContext中。由于TestExecutionClass实现ILogicalThreadAffinative,因此在创建新线程时,上下文会跟随测试。

对于我们的两个.NET Standard版本(1.3和1.6),上下文保留在线程本地存储中,因此不会跟随新线程的创建。当存在.NET Standard 2.0版本时,这是我们希望克服的限制。