目次
概要
xUnit.netのテスト実行時には、通常の Console.WriteLine を使用しても出力が表示されません。
代わりに ITestOutputHelper インターフェースをコンストラクタ経由で受け取り(依存性注入)、その WriteLine メソッドを使用することで、テストエクスプローラーの結果画面にログを出力できます。
仕様(入出力)
- インターフェース:
ITestOutputHelper(xunit.Abstractions) - 主なメソッド:
| メソッド名 | 説明 |
WriteLine(string message) | 文字列を出力し、末尾に改行を追加します。 |
WriteLine(string format, params object[] args) | 書式指定文字列を使用して、フォーマットされた文字列を出力します。 |
基本の使い方
public class MyTests
{
private readonly ITestOutputHelper _output;
// コンストラクタでインスタンスを受け取る
public MyTests(ITestOutputHelper output)
{
_output = output;
}
[Fact]
public void Test1()
{
// ログ出力
_output.WriteLine("Test1 started.");
Assert.True(true);
}
}
コード全文
入力された値をログに出力しながら、2つの数値のうち大きい方を返すメソッドを検証する例です。
using System;
using Xunit;
using Xunit.Abstractions; // 必須
namespace TestProject
{
public class DebugOutputTests
{
// 出力用ヘルパーを保持するフィールド
private readonly ITestOutputHelper _output;
// xUnitが自動的にITestOutputHelperの実装を注入してくれる
public DebugOutputTests(ITestOutputHelper output)
{
_output = output;
}
[Theory]
[InlineData(10, 5, 10)]
[InlineData(2, 8, 8)]
[InlineData(-1, -5, -1)]
public void Max_ReturnsLargerValue(int val1, int val2, int expected)
{
// 入力値をログに出力して確認できるようにする
_output.WriteLine($"Input Values: val1={val1}, val2={val2}");
_output.WriteLine($"Expected Max: {expected}");
var utils = new MathUtilities();
var result = utils.Max(val1, val2);
_output.WriteLine($"Actual Result: {result}");
Assert.Equal(expected, result);
}
}
// テスト対象クラス
public class MathUtilities
{
public int Max(int a, int b)
{
// Math.Maxと同じ挙動
return (a >= b) ? a : b;
}
}
}
カスタムポイント
- フォーマット出力:_output.WriteLine(“Value: {0}, ID: {1}”, value, id); のように、string.Format 形式での記述も可能です。
- 出力の確認場所:Visual Studioの場合、テストエクスプローラーで該当のテストを選択し、詳細ペインにある「出力」リンクをクリックするとログが表示されます。
注意点
- Console.WriteLineの無効化:xUnitはテストを並列実行するため、標準出力(Console)への書き込みはキャプチャされず、無視されます。必ず ITestOutputHelper を使用してください。
- コンストラクタでのみ取得可能:このヘルパーはテストクラスのコンストラクタでのみ注入されます。[Fact] メソッドの引数として直接受け取ることはできません。
- クラスフィクスチャとの併用:IClassFixture を実装している場合でも、ITestOutputHelper はあくまで「テストクラス(インスタンス)」に対して注入されるため、Fixture クラス側で直接これを受け取ることはできません(設計上の制約があります)。
応用
実行時間の計測ログ
処理にかかった時間を計測して出力する例です。
[Fact]
public void PerformanceTest()
{
var sw = System.Diagnostics.Stopwatch.StartNew();
// 重い処理...
System.Threading.Thread.Sleep(100);
sw.Stop();
_output.WriteLine($"Elapsed Time: {sw.ElapsedMilliseconds} ms");
}
まとめ
xUnit.netでのデバッグ出力は、ITestOutputHelper をコンストラクタで受け取って行います。これにより、並列実行時でも各テストケースに紐付いた正しいログが出力され、失敗時の原因調査や入力値のトレースが容易になります。
