私はReSharperテストランナーと xUnitContrib resharperプラグインでxUnitを使用しています。
実行時間の長いテストがある場合、ユニットテストの出力ウィンドウに進行状況インジケーターを出力できるようにしたいと思います。
私はもう試した 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 に投稿されました。
これはxUnit.netの制限であり、Resharperアダプターではありません。
XUnit.netのv2でこれに対処します。
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);
}
}
ReSharperはユニットテストでデフォルトのリスナーを何らかの方法で削除しました。出力ウィンドウにテキストを表示するには、次の行を追加します。
Debug.Listeners.Add(new DefaultTraceListener());
NUnitの場合、これは機能します。
Console.SetOut(TestContext.Progress);
**遅い答えは、私が同じ問題を抱えていて、それを解決したためです。他人を助けるかもしれない
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)
{
}
}
私が見つけた最も簡単な方法は、log4netを利用してコンソールロガーを作成することです。途中で、実行中にlogger.Info( "info here");を呼び出します。またはlog.Debug( "info here"); -本当に希望するロギングレベルであれば何でも-出力はResharperユニットテストセッションに表示されます。
Log4netフレームワークの詳細 Apache log4netホームページ を読んでください。 設定例 も非常に役立ちます。
ITestOutputhelper
をSUTに挿入する非常に優れたクリーンな方法であるxunit.NLog
の使用を検討することもできます。
http://www.tomdupont.net/2015/06/capture-xunit-test-output-with-nlog-and.html