NUnit の最新リリース に導入された Action Attribute はスイートやテスト,さらにテストケースの全体にわたってテストアクションを統括管理する機能だ。テストプロジェクトに含まれるクラスやインターフェース,メソッド,あるいはアセンブリに対して,テストアクションをカプセル化した Action Attribute を適用することによって setup と teardown,その他テストのサイドエフェクトの実行をアレンジできる。
所定のテストが実行されると,関連付けられたすべての Action Attribute が定義順に2回ずつコールされる。1度目は BeforeTest イベントであり,2度目は AfterTest イベントだ。この実行パターンによって開発者は,setup と teardown 間のテストの振る舞いを個別にコントロールすることが可能だ。
Action Attribute を利用する には,開発者はまず最初に新しい属性を定義する。属性は ITestAction を実装した Attribute 継承クラスとするか,あるいは TestActionAttribute を直接継承するか,どちらかの形式を取らなければならない。
以下のコードでは,ITestAction インターフェースを実装して Action Attribute を実装する方法を示している。
これと同じことを TestActionAttribute を継承して行うと,次のようなコードになる。
作成した Action Attribute は通常の .NET 属性として,テストプロジェクト内の任意のメソッド,クラス,インターフェース,あるいはアセンブリに適用することができる。
NUnit の出力には,Action Attribute の構成が反映される。
***** BankingTests.AccountTest.DepositFunds
Before via inheritance Case: AccountTest, from DepositFunds.
After via inheritance Case: AccountTest, from DepositFunds.
***** BankingTests.AccountTest.TransferFunds
Before via Interface Case: AccountTest, from TransferFunds.
After via Interface Case: AccountTest, from TransferFunds.
ひとつのターゲットに対して,複数の Action Attribute の適用が可能だ。同じカッコ内に定義された Action Attribute は左から右に,別々に定義された場合は下から上の順で実行される。
このように Action Attribute を組み合わせれば,それぞれが同じテスト内で実行される。
***** BankingTests.AccountTest.TransferWithInsufficientFunds
Before via Interface Case: AccountTest, from TransferWithInsufficientFunds.
Before via inheritance Case: AccountTest, from TransferWithInsufficientFunds.
After via inheritance Case: AccountTest, from TransferWithInsufficientFunds.
After via Interface Case: AccountTest, from TransferWithInsufficientFunds.
Action Attribute はユニットテストで定義した機能を,さまざまな方法で再利用するための柔軟性を提供するものだ。ユニットテストのセットアップと動作を構成することにより,平均レベルのテスト担当者による生産性とテスト効果は劇的に増大する。ただしその一方で,テストを保守するこれらの開発者から重要なテストロジックを隠蔽することにもなるので,不用意に利用すると小回りの利かない,階層化したユニットテストを作り上げる可能性もある。
Action Attribute 以外に,今回の NUnit では合計で 90 にのぼるバグフィックスと,フレームワークに対するいくつかの修正が実施されている。その他として,NUnit および .NET の旧バージョンに対するサポートが廃止された。NUnit では 2.6 のリリース時点で,最初のバージョンで導入した定義規則のサポートを廃止している。また別途ダウンロードの必要なくサポートされるのは,.NET 2.0 以降のみに限定されている。