使用ReSharper,如何在长时间运行的unit testing中显示调试输出?
我正在使用xUnit和ReSharper测试运行器以及xUnitContrib resharper插件。
当我有一个长时间运行的测试时,我希望能够将一些进度指示器输出到Unit Test Output窗口。
我已经尝试过Debug.WriteLines
, Trace.WriteLine
和Console.WriteLine
。 所有这些都具有相同的行为 – 在测试完成之前,输出窗口中没有任何内容显示。
例如:
[Fact] public void Test() { Debug.WriteLine("A"); Trace.WriteLine("B"); Console.WriteLine("C"); Thread.Sleep(10000); }
在10秒钟结束并且测试完成之前,测试显示没有输出。 如何获得输出?
更新1
我也试过MSTest和NUnit。 NUnit是唯一一个在整个过程中显示输出的人。
在测试完成之前,MSTest和XUnit不会返回任何输出。 奇怪的是,XUnit和NUnit测试输出如下所示:
A B C
MSTest输出如下所示:
C Debug Trace: A B
鉴于所有这些变化,我认为答案是由测试运行器实现决定如何以及何时输出。 有谁知道是否可以配置XUnit测试运行器?
更新2
我认为这必须是xUnitContrib的一个缺陷。 发布到他们的CodePlex问题跟踪器 。
如果您使用xUnit.net 1.x,则可能以前一直在将输出写入Console,Debug或Trace。 当xUnit.net v2默认启用并行化时,此输出捕获机制不再合适; 不可能知道可以并行运行的许多测试中的哪一个负责写入这些共享资源。 将代码从v1.x移植到v2.x的用户应该使用两种新方法中的一种。
看看这里有关如何使用xUnit.net v2执行日志记录的示例:
http://xunit.github.io/docs/capturing-output.html
这是一个例子:
using Xunit; using Xunit.Abstractions; public class MyTestClass { private readonly ITestOutputHelper output; public MyTestClass(ITestOutputHelper output) { this.output = output; } [Fact] public void MyTest() { var temp = "my class!"; output.WriteLine("This is output from {0}", temp); } }
ReSharper以某种方式删除了unit testing中的默认侦听器。 要在“输出”窗口中显示文本,只需添加以下行:
Debug.Listeners.Add(new DefaultTraceListener());
Per Brad Wilson :
这是xUnit.net中的限制,而不是Resharper适配器。
我们将在xUnit.net的v2中解决这个问题。
我发现最简单的方法是利用log4net并创建一个控制台记录器。 一路上,当你正在运行时,你会调用logger.Info(“info here”); 或log.Debug(“info here”); – 无论你喜欢什么样的日志记录级别 – 输出都会显示在Resharper Unit Test Sessions中。
阅读Apache log4net主页上有关log4net框架的更多信息。 配置示例也非常宝贵。