SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

C#で始めるテスト駆動開発入門

NUnitの全貌 ~ 基本から、最新バージョンの新機能まで

C#で始めるテスト駆動開発入門(3)


  • X ポスト
  • このエントリーをはてなブックマークに追加

そのほかの属性

(サンプルコード:「その11_その他の属性」クラス)

Category属性

 Category属性を継承して独自の属性を作っておいて、テストメソッドに付けます。カテゴリーごとにテストの実行が可能になります。

Combinatorial属性とValues属性

 Combinatorial属性Values属性を使うと、複数の引数を持つメソッドに対して、引数の組み合わせを総当たりでテストするコードが簡単に書けます。

その11_その他の属性.cs:引数の組み合わせを総当たりで試す
[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を設定します。

その11_その他の属性.cs:実行時の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属性は、指定範囲の疑似乱数を指定回数だけ与えてテストします。

その11_その他の属性.cs:1から3までの乱数を10回与えるテスト
[Test]
public void Test06_1以上4未満の乱数を与えるテスト([Random(1, 4, 10)]int r) {
	Console.WriteLine("引数は {0}", r);
	Assert.Pass();
}

Range属性

 Range属性は、指定範囲で指定したステップごとに引数を与えてテストします。

その11_その他の属性.cs:1から10まで3刻み(1,4,7,10)の引数を与えるテスト
[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と同様の機能です。

その11_その他の属性.cs:Theory
[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 になる。
}
訂正とお詫び(2012/04/27)

 「証明駆動開発」と説明しましたが、この用語は正しくありませんでした。訂正してお詫びします。
ご指摘くださった@bleis氏に感謝いたします。

 プログラムを証明するとは、プログラムを実行せずにその正しさを確認することなので、実際に実行してみなければならないNUnitで「証明」という言葉を使うのは間違いでした。なお、コード中のコメントにホーア・トリプルの事前状態P・事後状態Qを、Q・Rと表記したのは、完全に筆者の単純ミスです。

【参考】

  • 「証明駆動開発」(Proof Driven Development)の語源は、ラゴンヌ氏(@kinaba)による2008/05/15の記事のようです。
    証明駆動開発=『「先に証明の筋道と途中で使う補題を書いて、それを満たすようにコードを書く」スタイル』
  • ホーア式(ホーア・トリプル)やプログラム証明については、たとえば次の記事が参考になります。
    檜山正幸のキマイラ飼育記:極小プログラミング言語とホーア論理(2006/07/13)

次のページ
独自のアサーションを作る

修正履歴

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
C#で始めるテスト駆動開発入門連載記事一覧

もっと読む

この記事の著者

biac(ばいあっく)

HONDA R&Dで自動車の設計をやっていた機械屋さんが、技術の進化スピードに魅かれてプログラマーに。以来30年ほど、より良いコードをどうやったら作れるか、模索の人生。わんくま同盟の勉強会(名古屋)で、よく喋ってたりする。2014/10~2019/6 Microsoft MVP (Windows Devel...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/6518 2013/04/03 13:24

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング