【C#】InlineData属性を使用したパラメータ化テスト(データ駆動テスト)

目次

概要

xUnit.netの [Theory] 属性と [InlineData] 属性を組み合わせることで、1つのテストメソッドに対して複数の異なる入力パターンを連続して実行できます。 これを「パラメータ化テスト(Parameterized Tests)」または「データ駆動テスト」と呼び、境界値や異常値などのバリエーションを効率よく検証するのに適しています。

仕様(入出力)

  • 属性:
    • [Theory]: パラメータ化テストであることを宣言します(通常の [Fact] の代わりに使用)。
    • [InlineData(val1, val2, ...)]: テストメソッドの引数に渡す具体的な値を定義します。複数行記述可能です。
  • 動作: 定義した InlineData の数だけテストが繰り返し実行されます。

基本の使い方

[Theory]
[InlineData(1, 2, 3)] // a=1, b=2, expected=3
[InlineData(5, 5, 10)] // a=5, b=5, expected=10
public void SumTest(int a, int b, int expected)
{
    Assert.Equal(expected, a + b);
}

コード全文

提供されたコードのスペルミスを修正し、expected(期待値)を第一引数として受け取るパターンで実装した例です。

using System;
using Xunit;

namespace ParameterizedTests
{
    public class CalculationTests
    {
        /// <summary>
        /// [Theory] でパラメータ化テストを宣言
        /// [InlineData] で具体的なテストケース(期待値, x, y)を指定
        /// </summary>
        [Theory]
        [InlineData(20, 0, 20)]   // 0 + 20 = 20
        [InlineData(7, 2, 5)]     // 2 + 5 = 7
        [InlineData(10, 16, -6)]  // 16 + (-6) = 10
        public void Add_MultipleInputs_ReturnsCorrectSum(int expected, int x, int y)
        {
            // Arrange
            var obj = new MySampleClass();

            // Act
            var val = obj.Add(x, y);

            // Assert
            Assert.Equal(expected, val);
        }
    }

    /// <summary>
    /// テスト対象クラス
    /// </summary>
    public class MySampleClass
    {
        public int Add(int x, int y)
        {
            return x + y;
        }
    }
}

カスタムポイント

  • 引数の数と型: InlineData の引数の数と型は、テストメソッドの引数定義と一致している必要があります。一致しない場合、テスト実行時(またはコンパイル時)にエラーになります。
  • 詳細なテスト名: テストランナー上では、渡されたパラメータごとに別のテスト結果として表示されます(例: Add_MultipleInputs_ReturnsCorrectSum(expected: 20, x: 0, y: 20))。

注意点

  1. Factとの併用禁止: [Theory] を使う場合、[Fact] は付けません。両方付けるとエラーになります。
  2. 複雑なデータ: InlineData は定数(数値、文字列、nullなど)しか記述できません。配列やオブジェクト、ファイルからの読み込みなど複雑なデータを渡したい場合は、[MemberData][ClassData] 属性を使用します。
  3. 引数の順序: InlineData に書いた値は、左から順にテストメソッドの引数にマッピングされます。順序を間違えないように注意してください。

応用

複数の型を混在させる

文字列やブール値など、異なる型の引数を組み合わせることも可能です。

[Theory]
[InlineData("apple", 5, true)]
[InlineData("banana", 10, false)]
public void StringLengthTest(string text, int length, bool isShort)
{
    // ... 検証ロジック
}

まとめ

[InlineData] を使用することで、似たようなテストコードを何度もコピペする必要がなくなり、テストコードの保守性が劇的に向上します。正常系のパターン網羅や、境界値(0、マイナス、最大値など)の検証にはこの機能を積極的に利用してください。

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

この記事を書いた人

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

目次