【C#】xUnit.netの単体テストでデバッグメッセージを出力する

目次

概要

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の場合、テストエクスプローラーで該当のテストを選択し、詳細ペインにある「出力」リンクをクリックするとログが表示されます。

注意点

  1. Console.WriteLineの無効化:xUnitはテストを並列実行するため、標準出力(Console)への書き込みはキャプチャされず、無視されます。必ず ITestOutputHelper を使用してください。
  2. コンストラクタでのみ取得可能:このヘルパーはテストクラスのコンストラクタでのみ注入されます。[Fact] メソッドの引数として直接受け取ることはできません。
  3. クラスフィクスチャとの併用: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 をコンストラクタで受け取って行います。これにより、並列実行時でも各テストケースに紐付いた正しいログが出力され、失敗時の原因調査や入力値のトレースが容易になります。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次