使用ReSharper,如何在长时间运行的单元测试中显示调试输出?

Mat*_*int 33 c# resharper unit-testing xunit visual-studio

我正在使用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);
}
Run Code Online (Sandbox Code Playgroud)

测试显示没有输出,直到10秒钟结束并且测试完成.我如何获得输出?

更新1

我也试过MSTest和NUnit.NUnit是唯一一个在整个过程中显示输出的人.

在测试完成之前,MSTest和XUnit不会返回任何输出.奇怪的是,XUnit和NUnit测试输出如下所示:

A
B
C
Run Code Online (Sandbox Code Playgroud)

MSTest输出如下所示:

C


Debug Trace:

A
B
Run Code Online (Sandbox Code Playgroud)

鉴于所有这些变化,我认为答案是由测试运行器实现决定如何以及何时输出.有谁知道是否可以配置XUnit测试运行器?

更新2

我认为这必须是xUnitContrib的一个缺陷.发布到他们的CodePlex问题跟踪器.

Răz*_*nda 28

如果您使用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);
    }
}
Run Code Online (Sandbox Code Playgroud)


Mat*_*int 7

Per Brad Wilson:

这是xUnit.net中的限制,而不是Resharper适配器.

我们将在xUnit.net的v2中解决这个问题.

http://xunitcontrib.codeplex.com/workitem/4160


小智 6

ReSharper以某种方式删除了单元测试中的默认侦听器.要在"输出"窗口中显示文本,只需添加以下行:

Debug.Listeners.Add(new DefaultTraceListener());
Run Code Online (Sandbox Code Playgroud)


Yit*_*hak 6

对于NUnit,这有效:

Console.SetOut(TestContext.Progress);
Run Code Online (Sandbox Code Playgroud)

**较晚的答案是因为我有同样的问题,所以我才解决了。可以帮助别人


Sim*_*mon 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)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)