SHOEISHA iD

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

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

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

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

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


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

コレクション

(サンプルコード:「その06_コレクション」クラス)

 コレクションをテストするために、CollectionAssertクラスが用意されています。例えば次のように、順序を含めて等しいかを検査するにはAreEqual()メソッドを使います。

その06_コレクション.cs:順序を含めてコレクションを比較する
[Test]
public void Test01_順序も含めて等しいか() {
  var 期待値 = new int[]{ 1, 2, 3, };
  var 実際の値 = new int[] { 1, 2, 3, };
  CollectionAssert.AreEqual(期待値, 実際の値);

  // 否定形もある
  CollectionAssert.AreNotEqual(new int[] { 1, 3, 2, }, 実際の値);  //順序が違えば等しくない
  CollectionAssert.AreNotEqual(new int[] { 1, 2, }, 実際の値);     //要素数が違っても等しくない
}

 他には次のようなアサーションがあります。

  • 順序に関係なく等しいか:AreEquivalent(), AreNotEquivalent()
  • 特定の要素を含んでいるか:Contains(), DoesNotContain(), IsSubsetOf(), IsNotSubsetOf()
  • 空のコレクションか:IsEmpty(), IsNotEmpty()
  • 要素にnullが入っていないか:AllItemsAreNotNull()
  • すべての要素が同じ型か:AllItemsAreInstancesOfType()
  • すべての要素がユニークか:AllItemsAreUnique()
  • 昇順に並んでいるか:IsOrdered()

例外のテスト

(サンプルコード:「その07_例外」クラス)

 例外が出ることをテストするには、trycatchする方法(サンプルコードを見てください)やExpectedException属性を使う方法もありますが、今ではAssert.Throws()を使うようになっています。

その07_例外.cs:例外とそのメッセージ、さらに内部例外をチェックする
[Test]
public void Test03_AssertThrowsを使う方法() {
	var ex = Assert.Throws<DivideByZeroException>(() => 例外.例外を送出するメソッド());

	// Assert.Throws()は、発生した例外をそのまま返値にしてくれるので、
// 例外のメッセージやInnerExceptionを検査することも可能。
StringAssert.StartsWith("送出した例外", ex.Message); var innerEx = ex.InnerException; Assert.IsInstanceOf<NullReferenceException>(innerEx); StringAssert.StartsWith("内部で起きた", innerEx.Message); }

 なお、指定した例外を継承している例外ならば何でも良い、というときにはAssert.Catch()を使います。

新しい書き方 ~ Assert.That()

(サンプルコード:「その08_AssertThat」クラス)

 これは、NUnit2.4から導入されたアサーションの新しい書き方で、Constraint-Based Assert Model(仮に「制約ベースのアサートモデル」と訳しておきます)と呼ばれます。次の4通りの書き方があります。

  • 条件式:Assert.That(条件式)
  • オブジェクトと制約:Assert.That(オブジェクト, 制約)
  • オブジェクト(型指定付き)と制約:Assert.That<T>(ref T型のオブジェクト, 制約)
  • デリゲートと制約:Assert.That(デリゲート, 制約)

 条件式を与える書き方は簡単です。

その08_AssertThat.cs:条件式を与える
[Test]
public void Test01_条件式を与える() {
	var 期待値 = 3;
	var 実際の値 = 整数.加算する(1, 2);
	Assert.That(期待値 == 実際の値);
}

 制約は、Isで始まります。

その08_AssertThat.cs:簡単な制約の書き方
[Test]
public void Test02_オブジェクトと制約を与える() {
	var 期待値 = 3;
	var 実際の値 = 整数.加算する(1, 2);
	Assert.That(実際の値, Is.EqualTo(期待値));
}

[Test]
public void Test04_ラムダ式と制約を与える() {
	var 期待値 = 3;
	Assert.That(() => 整数.加算する(1, 2), Is.EqualTo(期待値));
}

 制約にはmodifier(修飾子)を付けられます。

その08_AssertThat.cs:modifierで制約に条件を追加する
[Test]
public void Test05_EqualToのModifier() {
  // 文字列比較
  Assert.That("aBc", Is.Not.EqualTo("ABC"));
  Assert.That("aBc", Is.EqualTo("ABC").IgnoreCase);
  Assert.That("aBc", Is.EqualTo("ABC").Using((IComparer)StringComparer.OrdinalIgnoreCase));

  // 浮動小数点数
  Assert.That(99.9, Is.Not.EqualTo(100.0));
  Assert.That(99.9, Is.EqualTo(100.0).Within(1).Percent);	// 1%の許容誤差
}

 複数の制約を組み合わせることもできます。

その08_AssertThat.cs:制約を組み合わせる
[Test]
public void Test06_制約を組み合わせる() {
  Assert.That("aBc", Has.Length.EqualTo(3) & Is.StringStarting("a") & Is.StringContaining("B"));
}

 ここで紹介できなかった制約や修飾子が、たくさんあります。詳しくは、サンプルコードConstraint-Based Assert Modelを参照してください。

次のページ
共通の準備と後始末

修正履歴

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

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング