Pex で使われている属性を調べてみた - PexMethodAttribute

Pex で使われている属性を調べてみた - PexClassAttribute - お だ のスペース
Pex で使われている属性を調べてみた - PexAllowedExceptionFromTypeUnderTestAttribute - お だ のスペース の続きです。
今回は、PexMethodAttribute について調べてみました。これで、Pex Wizard で生成されたコードに出てきた属性はおしまいです。

PexMethodAttribute

PexMethodAttribute
この属性は、パラメタ化されたテストを行うメソッドに対して指定します。また、PexClassAttribute がついたクラス内のメソッドに指定します。
Pex は、パラメーター化されたテストメソッドを、幾つかのパラメーターで呼び出す従来のパラメーター無しテストメソッド群を生成します。
パラメータ化されたテストは、
インスタンスメソッドであること
・must be visible to the test class into which the generated tests are placed according to the Settings Waterfall,
・任意の数のパラメーターを渡すことが出来る
ジェネリックも使えるよ
2番目のやつは長そうなので、ここで書きます。
visible ってのは、リンク先の内容を見ると 可視性(アクセス修飾子絡み)の話の様です。
Visibility
ざっくり書くと、
・internal:PexClass から見えるなら使えるよ。InternalsVisibleToAttribute クラス (System.Runtime.CompilerServices) を使って公開してね。この属性は、以前少し紹介しました。C# InternalsVisibleToAttribute と アセンブリの署名 - お だ のスペース
・private:生成するテストコードは、partial class を使うので、private でも見えるよ。
2010/09/12 追記
テスト対象のクラスの private メソッドがテスト出来るのではなく、Pex が生成したクラスが、自身(Pex が生成するクラス or パラメータ化されたテストクラス)の private メソッドを呼び出しても良いということです。
・protected:生成するテストコードは、partial class か サブクラスを使うので、protected でも見えるよ。


続いて、Settings Waterfall は設定の適用範囲についての話の様です。
これまたざっくり書くと、
アセンブリ(PexAssemblySettingsAttribute) に対しての設定
・クラス(PexClassAttribute) に対しての設定
・メソッド(PexExplorationAttributeBase((PexMethodAttribute のスーパークラス))) に対しての設定
・コマンドラインでの設定
このそれぞれの設定が、上から順に適用され、上の項目で設定されている内容が下の項目でも設定されていたら、下の設定が使われるという感じの事が書いてます。
イメージとしては、ASP.NET の config ファイルに似てますかね?
machine.config の設定が、アプリケーションルートの web.config で上書きされて、また、フォルダ階層毎に web.config を配置すれば、以下の階層の設定を上書き出来るみたいな。


長くなりましたが結局2番目の項目は、生成されたテストはいろんな設定を適用した上で元のテストを可視出来る必要があるって感じですかね。(※訳自信無し)


せっかくなんで、ジェネリック についても簡単に紹介します。
Generic Parameterized Unit Testing
PexGenericArgumentsAttribute ってのを使って実現する様です。

Generic Parameterized Unit Testing から引用

[PexClass]
public partial class ListTest {
    [PexMethod]
    [PexGenericArguments(typeof(int))]
    [PexGenericArguments(typeof(object))]
    public void AddItem<T>(List<T> list, T value)
    { ... }
}