SHOEISHA iD

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

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

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

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

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


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

NUnit2.6の新機能:Action属性クラス

(サンプルコード:「新機能_Action属性クラス」クラス)

 Action属性というのは、Attributeクラスを継承し、NUnitのITestActionインターフェースを実装して自分で作る属性クラスです。

 テストクラス・テストメソッドごとに自由に設定できる共通の前処理・後処理を書くことができます。SetUpTearDown属性では、すべてのメソッドで同じ前処理・後処理が実行されてしまいますが、Action属性では、属性を付けたメソッドだけでその前処理・後処理が実行されます。

 Action属性クラスは次のように書きます。

新機能_Action属性クラス.cs:テストクラスにもテストメソッドにも付けられるAction属性の例
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple = false)]
public class MyDefaultActionAttribute : Attribute, ITestAction {

  private string _message;
  public MyDefaultActionAttribute(string message) { _message = message; }

  // 属性を付けたテストが実行される直前に呼び出される
  public void BeforeTest(TestDetails details) {
    if (details.IsSuite)
      WriteToConsole("◇MyDefaultAction - TestFixtureSetUp", details);
    else
      WriteToConsole("◇MyDefaultAction - SetUp", details);
  }

  // 属性を付けたテストが実行された直後に呼び出される
  public void AfterTest(TestDetails details) {
    if (details.IsSuite)
      WriteToConsole("◇MyDefaultAction - TestFixtureTearDown", details);
    else
      WriteToConsole("◇MyDefaultAction - TearDown", details);
  }

  public ActionTargets Targets {
    get { return ActionTargets.Default; }
  }

  private void WriteToConsole(string eventMessage, TestDetails details) {
    Console.WriteLine("{0} {1}: {2}, from {3}.{4}.",
      eventMessage,
      details.IsSuite ? "Suite" : "Case",
      _message,
      details.Fixture != null ? details.Fixture.GetType().Name : "{no fixture}",
      details.Method != null ? details.Method.Name : "{no method}"
    );
  }
}

 こうして作ったAction属性は、次のように使えます。

新機能_Action属性クラス.cs:作成したAction属性を使う
[TestFixture]
[MyDefaultAction("テストクラスに付けた")]
public class 新機能_Action属性クラス {

  [Test]
  public void Test01_加算() {
    Console.WriteLine("■ Test01_加算");
    Assert.That(整数.加算する(1, 2), Is.EqualTo(3));
  }

  [MyDefaultAction("Test02_偶奇判定")]
  [TestCase(1, false)]
  [TestCase(2, true)]
  public void Test02_偶奇判定_TestCase属性で複数回実行(int n, bool expected) {
    Console.WriteLine("■ Test02_偶奇判定");
    Assert.That(整数.Is偶数(n), Is.EqualTo(expected));
  }

  [TestFixtureSetUp] public void TestFixtureSetUp() {	Console.WriteLine("通常の TestFixtureSetUp");	}
  [TestFixtureTearDown] public void TestFixtureTearDown() { Console.WriteLine("通常の TestFixtureTearDown"); }
  [SetUp] public void SetUp() { Console.WriteLine("通常の SetUp"); }
  [TearDown] public void TearDown() { Console.WriteLine("通常の TearDown"); }
}

 この実行結果は、次のようになります(読みやすいように空行を入れた)。

実行結果(コンソール出力)
通常の TestFixtureSetUp
◇MyDefaultAction - TestFixtureSetUp Suite: テストクラスに付けた, from 新機能_Action属性クラス.{no method}.

***** CsTdd03Tests.新機能_Action属性クラス.Test01_加算
通常の SetUp
■ Test01_加算
通常の TearDown

***** CsTdd03Tests.新機能_Action属性クラス.Test02_偶奇判定_TestCase属性で複数回実行(1,False)
通常の SetUp
◇MyDefaultAction - SetUp Case: Test02_偶奇判定, from 新機能_Action属性クラス.Test02_偶奇判定_TestCase属性で複数回実行.
■ Test02_偶奇判定
◇MyDefaultAction - TearDown Case: Test02_偶奇判定, from 新機能_Action属性クラス.Test02_偶奇判定_TestCase属性で複数回実行.
通常の TearDown

***** CsTdd03Tests.新機能_Action属性クラス.Test02_偶奇判定_TestCase属性で複数回実行(2,True)
通常の SetUp
◇MyDefaultAction - SetUp Case: Test02_偶奇判定, from 新機能_Action属性クラス.Test02_偶奇判定_TestCase属性で複数回実行.
■ Test02_偶奇判定
◇MyDefaultAction - TearDown Case: Test02_偶奇判定, from 新機能_Action属性クラス.Test02_偶奇判定_TestCase属性で複数回実行.
通常の TearDown

◇MyDefaultAction - TestFixtureTearDown Suite: テストクラスに付けた, from 新機能_Action属性クラス.{no method}.
通常の TestFixtureTearDown

まとめ

 最新版のNUnitの機能を紹介しましたが、いかがだったでしょうか。あまりにも多機能で、テストを書くときにどの機能を使えばよいか迷うかもしれません。しかし最初に述べたように、どんなテストだってIsTrue()だけ知っていれば書けますから、あとは少しずつ覚えていけばよいのです。

 NUnitの豊富な機能は、メンテナンスしやすいテストコードを簡潔に書くためにあります。ほとんどの機能は知らなくてもどうということはありませんが、知っていれば、より良いテストコードをすばやく書く助けになることでしょう。テストコードをリファクタリングしたくなった時には、本記事を思い出してください。

修正履歴

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

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング