共通の準備と後始末
(サンプルコード:「その09_共通の準備と後始末」クラス)
共通の準備と後始末をするメソッドを書けるように、4つの属性が用意されています。
TestFixtureSetUp
属性
この属性が付けられたメソッドは、そのテストクラスでのテストを実行する前に、1度だけ実行される。SetUp
属性
この属性が付けられたメソッドは、そのテストクラス中のテストメソッドを実行する前に、毎回実行される。TearDown
属性
この属性が付けられたメソッドは、そのテストクラス中のテストメソッドを実行しおわった後に、毎回実行される。TestFixtureTearDown
属性
この属性が付けられたメソッドは、そのテストクラスでのテストをすべて実行しおわった後に、1度だけ実行される。
これらのメソッドは、NUnit2.5からはstatic
メソッドにすることもできるようになりました。また、複数あってもよくなりましたので、ベースクラスと継承したテストクラスの両方に書けるようになりました。
なお、いくつかのテストメソッドだけに共通する準備と後始末を書くための仕掛けとして、NUnit2.6ではAction
属性クラスが導入されています(後述)。
データ駆動テスト
(サンプルコード:「その10_データ駆動テスト」クラス)
テストで使う引数や期待値などを外部から与えるデータ駆動テストは、MSTestでは良く知られていますが、NUnitでもバージョン2.5から対応しています。TestCaseSource
属性を使います。
クラス内の指定したメンバーをソースとして、そこに含まれている値を順番にテストメソッドの引数に割り当ててくれます。
static int[] 偶数 = new int[] { 2, 4, 6, 8 }; [Test, TestCaseSource("偶数")] public void Test01a_ハードコーディングしたデータ_偶数(int num) { Assert.IsTrue(整数.Is偶数(num)); }
上の例では、TestCase
属性を使うのとたいして違いがないように思えるかもしれませんが、メンバー変数をプロパティに変えると外部のデータを読み込んだりできるようになります。
次の例では、IEnumerable<TestCaseData>
型を返すAllTestCases
というプロパティをソースにしていますが、このプロパティ内ではCSVファイルを読み込んで引数と期待値をセットしています。
// テストデータを提供するクラス public static class 偶数奇数データ { private const string DataCsvFile = "./偶数奇数データ.csv"; public static IEnumerable<TestCaseData> AllTestCases { get { foreach (var line in File.ReadLines(DataCsvFile)) { var items = line.Split(','); int num = int.Parse(items[0].Trim()); //引数 bool expected = bool.Parse(items[1].Trim()); //期待値 yield return new TestCaseData(num).Returns(expected); } } } } [TestFixture] public class その10_データ駆動テスト { [Test, TestCaseSource(typeof(偶数奇数データ), "AllTestCases")] public bool Test02b_CSVファイルから読み込んだデータ_全部(int num) { return 整数.Is偶数(num); } }
ソースとしてTestCaseData
のコレクションを使った場合は、この例のように期待値も提供することができます。また、期待される例外を渡すことも可能です。