ChainingAssertion for MSTest のパラメタライズドテストを NUnit 感覚で利用すると…

Chaining Assertion - Home 最近使っていますが、ものすごく便利です。
.NET でテストを書いているかたは、是非使ってみてください。


ChainingAssertion がどんなのかは、ここらへんを
neue cc - テストを簡単にするほんの少しの拡張メソッド
neue cc - メソッドチェーン形式のテスト記述ライブラリ
neue cc - Chaining Assertion ver 1.6.0.0
neue cc - SL/WP7のSilverlight Unit Test Frameworkについて少し深く


で本題。
MSTest では、パラメタライズドテストがありません。が、ChainingAssertion for MSTest は上手いこと NUnit みたいな感じでパラメタライズドテストが書けるようにしてくれています。
ただ、テストメソッド毎の初期/後処理の挙動が若干 NUnit と違いました。
MSTest のテストメソッド毎の初期/後処理は、以下の属性を使って実装します。
TestInitializeAttribute クラス (Microsoft.VisualStudio.TestTools.UnitTesting)
TestCleanupAttribute クラス (Microsoft.VisualStudio.TestTools.UnitTesting)
NUnit でこれに対応するのは、
NUnit - Setup
NUnit - Teardown
になります。
NUnit の場合、パラメタライズドテストの各パラメータ毎に、SetUp/TearDown が実行されますが、ChainingAssertion for MSTest の場合は、各パラメータ毎には実行されず大元のメソッドの開始/終了で実行されます。
これを回避するには、パラメタライズドテストで実行する Action を try - finally で囲って初期/後処理を実装すれば回避出来ます。


ChainingAssertion の方で吸収出来ないかな〜と、ちょっと考えたんですが良い案が思い浮かばず CodePlex には書きませんでした。
こんな感じになっちゃうんですよね…

大元のテストメソッドの開始時
TestInitialize
パラメタライズドテスト
TestInitialize
TestCleanup
次のパラメタライズドテスト
TestInitialize
TestCleanup
大元のテストメソッドの終了時
TestCleanup

最初と最後で TestInitialize/TestCleanup が二回呼ばれてしまう。ループ初回/最後で TestInitialize/TestCleanup を呼ばないみたいな実装したら良いんだけど。
TestInitialize/TestCleanup を使わずに、Action とかで初期/後処理を渡す方がすっきりするのかな〜。