ダウンロード サンプルソース(C#) (29.1 KB)
ダウンロード CsTdd03__20130403.zip (29.0 KB)
-
- Page 8
NUnit2.6の新機能:Action属性クラス
(サンプルコード:「新機能_Action属性クラス」クラス)
Action属性というのは、Attributeクラスを継承し、NUnitのITestActionインターフェースを実装して自分で作る属性クラスです。
テストクラス・テストメソッドごとに自由に設定できる共通の前処理・後処理を書くことができます。SetUp/TearDown属性では、すべてのメソッドで同じ前処理・後処理が実行されてしまいますが、Action属性では、属性を付けたメソッドだけでその前処理・後処理が実行されます。
Action属性クラスは次のように書きます。
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属性を使う[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の豊富な機能は、メンテナンスしやすいテストコードを簡潔に書くためにあります。ほとんどの機能は知らなくてもどうということはありませんが、知っていれば、より良いテストコードをすばやく書く助けになることでしょう。テストコードをリファクタリングしたくなった時には、本記事を思い出してください。
- 修正履歴
-
- 2013/04/03 13:13 p.2 Test03_IsNullメソッドで使っているアサーションがNull()になっていました。IsNull()に訂正しました。
- 2012/04/27 14:54 p.6「Theory属性とDatapoints属性」の説明とコードを訂正
- 2012/04/02 13:02 初稿完
この記事は参考になりましたか?
既に会員の方はを行ってください。
- C#で始めるテスト駆動開発入門連載記事一覧
- この記事の著者
-
biac(ばいあっく)
HONDA R&Dで自動車の設計をやっていた機械屋さんが、技術の進化スピードに魅かれてプログラマーに。以来30年ほど、より良いコードをどうやったら作れるか、模索の人生。わんくま同盟の勉強会(名古屋)で、よく喋ってたりする。2014/10~2019/6 Microsoft MVP (Windows Devel...
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
この記事は参考になりましたか?
この記事をシェア
