そのほかの属性
(サンプルコード:「その11_その他の属性」クラス)
Category属性
Category
属性を継承して独自の属性を作っておいて、テストメソッドに付けます。カテゴリーごとにテストの実行が可能になります。
Combinatorial属性とValues属性
Combinatorial
属性とValues
属性を使うと、複数の引数を持つメソッドに対して、引数の組み合わせを総当たりでテストするコードが簡単に書けます。
[Test] [Combinatorial] public void Test01_組み合わせテスト([Values(1, 2, 3)]int n, [Values("A", "B")] string s) { Console.WriteLine("引数に({0}, {1})を渡してテスト対象を呼び出します", n, s); Assert.Pass(); }
この例では、引数(n, s)
の組み合わせは、(1, "A")
、(1, "B")
、(2, "A")
、(2, "B")
、(3, "A")
、(3, "B")
の6通りがテストされます。
Culture属性とSetCulture属性
Culture
属性はテストクラス全体の、SetCulture
属性は付与したテストメソッドの実行時のCultureを設定します。
[Test] [SetCulture("ja-JP")] public void Test02j_SetCultureで日本を指定() { Assert.AreEqual("3月", DateTimeOffset.Parse("2012/3/28").Get月の名前()); Assert.AreEqual("水曜日", DateTimeOffset.Parse("2012/3/28").Get曜日の名前()); } [Test] [SetCulture("en-US")] public void Test02u_SetCultureで米国を指定() { Assert.AreEqual("March", DateTimeOffset.Parse("28-Mar-2012").Get月の名前()); Assert.AreEqual("Wednesday", DateTimeOffset.Parse("28-Mar-2012").Get曜日の名前()); }
Explicit属性とIgnore属性
Explicit
属性を付けたテストメソッドは、通常は実行されません。ただし、Ignore
属性とは異なり、Explicit
属性は個別に選択すれば実行できます。どちらも、そのテストをGREENにするのをしばらく先延ばしにするときなどに利用します。
MaxTime属性とTimeout属性
どちらの属性も、実行に指定した時間以上掛かるとテストは失敗となります。その時点でTimeout
属性では強制終了させられますが、MaxTime
属性では完了するまで実行が続きます。
Platform属性
Platform
属性を使って、特定のプラットフォームのときだけ実行する(あるいは実行しない)ことを指定できます。例えば、[Platform("Windows8")]
とテストメソッドに付けると、Windows XPや7の上では実行されなくなります。
Random属性
Random
属性は、指定範囲の疑似乱数を指定回数だけ与えてテストします。
[Test] public void Test06_1以上4未満の乱数を与えるテスト([Random(1, 4, 10)]int r) { Console.WriteLine("引数は {0}", r); Assert.Pass(); }
Range属性
Range
属性は、指定範囲で指定したステップごとに引数を与えてテストします。
[Test] public void Test07_1から10まで3刻みに引数を与えるテスト([[Range(1, 10, 3)]int n) { Console.WriteLine("引数は {0}", n); Assert.Pass(); }
Theory属性とDatapoints属性
Theory
属性とDatapoints
属性を合わせて使います。JUnitのTheoriesと同様の機能です。
[Datapoints] public double[] SquareRootに与える値 = new double[] { 0.0, 1.0, -1.0, 42.0, }; [Theory] public void Test08_SquareRootの定義(double num) { // assume(P); Assume.That(num >= 0.0); // 入力は非負の実数であること。負の値のときは定義されない。 // ※ Assume.That() で条件を満たさない時(num=-1.0)は、以降は実行されない。 // program(S); double sqrt = Math.Sqrt(num); // num = 0.0, 1.0, 42.0 が与えられる。 // assert(Q); Assert.That(sqrt >= 0.0); // SquareRoot は非負の実数である。 Assert.That(sqrt * sqrt, Is.EqualTo(num).Within(0.000001)); // SquareRoot は二乗すると num になる。 }
「証明駆動開発」と説明しましたが、この用語は正しくありませんでした。訂正してお詫びします。
ご指摘くださった@bleis氏に感謝いたします。
プログラムを証明するとは、プログラムを実行せずにその正しさを確認することなので、実際に実行してみなければならないNUnitで「証明」という言葉を使うのは間違いでした。なお、コード中のコメントにホーア・トリプルの事前状態P・事後状態Qを、Q・Rと表記したのは、完全に筆者の単純ミスです。
【参考】
- 「証明駆動開発」(Proof Driven Development)の語源は、ラゴンヌ氏(@kinaba)による2008/05/15の記事のようです。
証明駆動開発=『「先に証明の筋道と途中で使う補題を書いて、それを満たすようにコードを書く」スタイル』 - ホーア式(ホーア・トリプル)やプログラム証明については、たとえば次の記事が参考になります。
檜山正幸のキマイラ飼育記:極小プログラミング言語とホーア論理(2006/07/13)