前回 Pex を使うクラスには、日本語を使わない方が良さそう… - お だ のスペース で 日本語が含まれてるとイマイチと書きましたが、よくよく考えてみると、問題が出てるのって Pex Wizard(pexwizard.exe) で自動生成しているコードなんですよね。
じゃあ自動生成しなけりゃ良くね?ってことで、前回紹介した自動生成されたコードで使われている属性を調べてみようと思います。
Pex Wizard で生成されたコード
// <copyright file="_Test.cs">Copyright © 2010</copyright> using System; using ClassLibrary1; using Microsoft.Pex.Framework; using Microsoft.Pex.Framework.Validation; using NUnit.Framework; namespace ClassLibrary1 { [PexClass(typeof(\u7a0e\u51e6\u7406))] [PexAllowedExceptionFromTypeUnderTest(typeof(InvalidOperationException))] [PexAllowedExceptionFromTypeUnderTest(typeof(ArgumentException), AcceptExceptionSubtypes = true)] [TestFixture] public partial class _Test { [PexMethod] public decimal _( [PexAssumeUnderTest]\u7a0e\u51e6\u7406 target, decimal _, decimal _ ) { decimal result = target.\u5916\u7a0e\u8a08\u7b97(_, _); return result; } } }
PexClassAttribute
PexClassAttribute
PexClassAttirubute は、NUnit の TestFixtureAttribute と同じ意味合いの物らしいです。但し、Optional と書かれているので省略可能なようです。
また、次の条件を満たすクラスにしか適用出来ないようです。
- public / internal な公開された型(原文は、publicly exported type)※訳は自信無いので原文載せてます
- デフォルト(引数無)コンストラクタがある
- abstract(抽象)クラスではない
※これらを満たしていないと、Pex 実行時にエラーが発生します。*1コンパイル時ではありません!
ここらへんの条件は、NUnit の TestFixture でも似たような感じですね。TestFixture の場合、private や abstract にも適用出来ますが。*2
NUnit TestFixture の場合は、こんなのもOK!
public class Parent { [TestFixture] private abstract class AbstractClass { [Test] public void aaa() { Assert.AreEqual(this.GetExpected(), this.GetActual()); } protected abstract int GetExpected(); protected abstract int GetActual(); } private class SubClass : AbstractClass { protected override int GetExpected() { return 1; } protected override int GetActual() { return 1; } } }
PexClassAttribute はコンストラクタで、Suite と Type Under Test を指定出来ます。
Suite は、NUnit でいう CategoryAttribute の様なものです。Pex 実行時にフィルタリング出来ます。
/SuiteFilter:
コマンドラインでは、こんな感じで指定します。
pex ClassLibrary1.Test.dll /sf:Hoge
Type Under Test とは、Test To Code Binding に載っています。
テスト対象の型を指定出来るようです。これを指定すると何か良い事があるのかな?未だ調べきれていません。
なんか長くなったので、他の属性は明日以降に書きます。