目次
概要
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))。
注意点
- Factとの併用禁止:
[Theory]を使う場合、[Fact]は付けません。両方付けるとエラーになります。 - 複雑なデータ:
InlineDataは定数(数値、文字列、nullなど)しか記述できません。配列やオブジェクト、ファイルからの読み込みなど複雑なデータを渡したい場合は、[MemberData]や[ClassData]属性を使用します。 - 引数の順序:
InlineDataに書いた値は、左から順にテストメソッドの引数にマッピングされます。順序を間違えないように注意してください。
応用
複数の型を混在させる
文字列やブール値など、異なる型の引数を組み合わせることも可能です。
[Theory]
[InlineData("apple", 5, true)]
[InlineData("banana", 10, false)]
public void StringLengthTest(string text, int length, bool isShort)
{
// ... 検証ロジック
}
まとめ
[InlineData] を使用することで、似たようなテストコードを何度もコピペする必要がなくなり、テストコードの保守性が劇的に向上します。正常系のパターン網羅や、境界値(0、マイナス、最大値など)の検証にはこの機能を積極的に利用してください。
