テストを作成していると、引数の値と結果は違うけれどもコードは同じ、ということが多くあります。
そういう場合はTestCase属性でまとめて実行できます。
テストケースをまとめて記述する
public int SumInt(int a, int b) { return a + b; }
というメソッドをテストするとき、変更が必要なのはaとbの値、それと結果です。
これを
[Test] public void SumIntTest() { Sample s = new Sample (); Assert.AreEqual (2, s.SumInt (1, 1)); Assert.AreEqual (3, s.SumInt (2, 1)); Assert.AreEqual (4, s.SumInt (3, 1)); }
というように列挙してテストしてもよいのですが、TestCase属性を使うと
[TestCase(1, 1, Result=2)] [TestCase(2, 1, Result=3)] [TestCase(3, 1, Result=4)] public int SumIntTest(int a, int b) { Sample s = new Sample (); return s.SumInt (a, b); }
というようにさらに省くことができます。
TestCaseで指定した値をメソッドの引数に順に当てはめていき、テスト用メソッドの戻り値をResultと比較することでテストを行っています。
TestRunnerには次のように、TestCaseが一つづつ表示されています。
配列を使用する
とはいえ列挙するのもめんどくさい。そういうときには、TestCaseSource属性を使用することで配列を指定することができます。
private static object[] sum_params = { new object[]{ 1, 1, 2 }, new object[]{ 2, 1, 3 }, new object[]{ 3, 1, 4 }, };
というように値を列挙したstatic変数を用意し、
[TestCaseSource("sum_params")] public void SumIntTest(int a, int b, int result) { Sample s = new Sample (); Assert.AreEqual (result, s.SumInt (a, b)); }
とTestCaseSourceで指定します。
すると、このようになります。
object[]に指定したパラメータが、引数に順に格納されている感じですね。
IEnumratableを指定する
さらに、このデータソースとしてIEnumratableを指定することもできます。
この場合はプロパティとして定義します。
private static IEnumerable sum_params { get { yield return new TestCaseData(1, 1).Returns(2); yield return new TestCaseData(2, 1).Returns(3); yield return new TestCaseData(3, 1).Returns(4); } }
というように。
TestCaseDataオブジェクトのコンストラクタにパラメータを指定し、Returnsで戻り値を指定します。
こちらの場合は、戻り値がint型のテストメソッドが使用でき、
[TestCaseSource("sum_params")] public int SumIntTest(int a, int b) { Sample s = new Sample (); return s.SumInt (a, b); }
と書くことができます。
IEnumrableでは値を戻すためにコードを書くことができるので、より柔軟にテスト用の値が生成できます。