我正在将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 issue tracker。
答案 0 :(得分:25)
如果你使用xUnit.net 1.x,你可能以前写过输出 到控制台,调试或跟踪。当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);
}
}
答案 1 :(得分:7)
ReSharper以某种方式删除了单元测试中的默认侦听器。要在“输出”窗口中显示文本,只需添加以下行:
Debug.Listeners.Add(new DefaultTraceListener());
答案 2 :(得分:6)
这是xUnit.net的限制,而不是Resharper适配器。
我们将在xUnit.net的v2中解决这个问题。
答案 3 :(得分:3)
对于NUnit,此方法有效:
Console.SetOut(TestContext.Progress);
**较晚的答案是因为我遇到了同样的问题,所以我才解决了。可以帮助别人
答案 4 :(得分:2)
XunitLogger使用AsyncLocal<T>
来跟踪日志记录上下文,因此可以将对Trace.Writeline
和Console.Writeline
的调用路由到ITestOutputHelper
的正确实例。
用法:
static class ClassBeingTested
{
public static void Method()
{
Trace.WriteLine("From Trace");
Console.WriteLine("From Console");
Console.Error.WriteLine("From Console Error");
}
}
public class TestBaseSample :
XunitLoggingBase
{
[Fact]
public void Write_lines()
{
WriteLine("From Test");
ClassBeingTested.Method();
var logs = XunitLogger.Logs;
Assert.Contains("From Test", logs);
Assert.Contains("From Trace", logs);
Assert.Contains("From Console", logs);
Assert.Contains("From Console Error", logs);
}
public TestBaseSample(ITestOutputHelper output) :
base(output)
{
}
}
答案 5 :(得分:0)
我发现最简单的方法是利用log4net并创建一个控制台记录器。一路上,当你正在运行时,你会调用logger.Info(“info here”);或log.Debug(“info here”); - 无论您的首选日志记录级别如何 - 输出将显示在Resharper Unit Test Sessions中。
阅读有关log4net框架on the Apache log4net homepage的更多信息。 configuration examples也是非常宝贵的。
答案 6 :(得分:0)
您还可以考虑使用xunit.NLog
,这是一种将ITestOutputhelper
注入SUT的非常好和干净的方法。
http://www.tomdupont.net/2015/06/capture-xunit-test-output-with-nlog-and.html
答案 7 :(得分:0)
在您提出问题 8 年后,我对 NUnit 也遇到了同样的问题。 :-(
我很确定这是在某些时候从 Resharper 默认实现的,因为我不记得我之前必须手动执行此操作。但在某个时候,它停止了工作。
解决方案(对于 NUnit)是在 NUnit 单元测试的顶部添加这一行。
Console.SetOut(TestContext.Progress)
这使您的所有(现有)Console.Out.WriteLine("") 输出直接到 Resharper Unit Test Runner 输出部分,同时单元测试正在执行。