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

时间:2013-02-26 15:06:05

标签: c# visual-studio unit-testing resharper xunit

我正在将xUnit与ReSharper测试运行器和xUnitContrib resharper插件一起使用。

当我有一个长时间运行的测试时,我希望能够将一些进度指示器输出到Unit Test Output窗口。

我已尝试Debug.WriteLinesTrace.WriteLineConsole.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

8 个答案:

答案 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)

Brad Wilson

  

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

     

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

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

答案 3 :(得分:3)

对于NUnit,此方法有效:

Console.SetOut(TestContext.Progress);

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

答案 4 :(得分:2)

XunitLogger使用AsyncLocal<T>来跟踪日志记录上下文,因此可以将对Trace.WritelineConsole.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 输出部分,同时单元测试正在执行。