SHOEISHA iD

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

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

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

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

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


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

共通の準備と後始末

(サンプルコード:「その09_共通の準備と後始末」クラス)

 共通の準備と後始末をするメソッドを書けるように、4つの属性が用意されています。

  • TestFixtureSetUp属性
    この属性が付けられたメソッドは、そのテストクラスでのテストを実行する前に、1度だけ実行される。
  • SetUp属性
    この属性が付けられたメソッドは、そのテストクラス中のテストメソッドを実行する前に、毎回実行される。
  • TearDown属性
    この属性が付けられたメソッドは、そのテストクラス中のテストメソッドを実行しおわった後に、毎回実行される。
  • TestFixtureTearDown属性
    この属性が付けられたメソッドは、そのテストクラスでのテストをすべて実行しおわった後に、1度だけ実行される。

 これらのメソッドは、NUnit2.5からはstaticメソッドにすることもできるようになりました。また、複数あってもよくなりましたので、ベースクラスと継承したテストクラスの両方に書けるようになりました。

 なお、いくつかのテストメソッドだけに共通する準備と後始末を書くための仕掛けとして、NUnit2.6ではAction属性クラスが導入されています(後述)。

データ駆動テスト

(サンプルコード:「その10_データ駆動テスト」クラス)

 テストで使う引数や期待値などを外部から与えるデータ駆動テストは、MSTestでは良く知られていますが、NUnitでもバージョン2.5から対応しています。TestCaseSource属性を使います。

 クラス内の指定したメンバーをソースとして、そこに含まれている値を順番にテストメソッドの引数に割り当ててくれます。

その10_データ駆動テスト.cs:ソースとしてクラス内のメンバーを指定する
static int[] 偶数 = new int[] { 2, 4, 6, 8 };

[Test, TestCaseSource("偶数")]
public void Test01a_ハードコーディングしたデータ_偶数(int num) {
	Assert.IsTrue(整数.Is偶数(num));
}

 上の例では、TestCase属性を使うのとたいして違いがないように思えるかもしれませんが、メンバー変数をプロパティに変えると外部のデータを読み込んだりできるようになります。

 次の例では、IEnumerable<TestCaseData>型を返すAllTestCasesというプロパティをソースにしていますが、このプロパティ内ではCSVファイルを読み込んで引数と期待値をセットしています。

その10_データ駆動テスト.cs:ソースとして別のクラスを指定する
// テストデータを提供するクラス
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のコレクションを使った場合は、この例のように期待値も提供することができます。また、期待される例外を渡すことも可能です。

次のページ
そのほかの属性

修正履歴

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

  • 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」など、さまざまなカンファレンスを企画・運営しています。

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

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

メールバックナンバー

アクセスランキング

アクセスランキング