web-dev-qa-db-ja.com

ReSharperを使用して、長時間実行ユニットテスト中にデバッグ出力を表示するにはどうすればよいですか?

私はReSharperテストランナーと xUnitContrib resharperプラグインでxUnitを使用しています。

実行時間の長いテストがある場合、ユニットテストの出力ウィンドウに進行状況インジケーターを出力できるようにしたいと思います。

私はもう試した Debug.WriteLinesTrace.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 に投稿されました。

33

ブラッド・ウィルソン

これはxUnit.netの制限であり、Resharperアダプターではありません。

XUnit.netのv2でこれに対処します。

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

6

XUnit.net 1.xを使用した場合は、以前にコンソール、デバッグ、またはトレースに出力を書き込んでいた可能性があります。 xUnit.net v2がデフォルトで並列化がオンになって出荷されたとき、この出力キャプチャメカニズムは適切ではなくなりました。並行して実行できる多くのテストのどれがそれらの共有リソースへの書き込みの原因であったかを知ることは不可能です。 v1.xからv2.xにコードを移植するユーザーは、代わりに2つの新しい方法のいずれかを使用する必要があります。

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);
    }
}
27

ReSharperはユニットテストでデフォルトのリスナーを何らかの方法で削除しました。出力ウィンドウにテキストを表示するには、次の行を追加します。

Debug.Listeners.Add(new DefaultTraceListener());
6
Thông Nguyễn

NUnitの場合、これは機能します。

Console.SetOut(TestContext.Progress);

**遅い答えは、私が同じ問題を抱えていて、それを解決したためです。他人を助けるかもしれない

5
Yitzchak

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)
    {
    }
}
2
Simon

私が見つけた最も簡単な方法は、log4netを利用してコンソールロガーを作成することです。途中で、実行中にlogger.Info( "info here");を呼び出します。またはlog.Debug( "info here"); -本当に希望するロギングレベルであれば何でも-出力はResharperユニットテストセッションに表示されます。

Log4netフレームワークの詳細 Apache log4netホームページ を読んでください。 設定例 も非常に役立ちます。

0
brenton

ITestOutputhelperをSUTに挿入する非常に優れたクリーンな方法であるxunit.NLogの使用を検討することもできます。

http://www.tomdupont.net/2015/06/capture-xunit-test-output-with-nlog-and.html

0
Matze