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

前回 Pex を使うクラスには、日本語を使わない方が良さそう… - お だ のスペース で 日本語が含まれてるとイマイチと書きましたが、よくよく考えてみると、問題が出てるのって Pex Wizard(pexwizard.exe) で自動生成しているコードなんですよね。
じゃあ自動生成しなけりゃ良くね?ってことで、前回紹介した自動生成されたコードで使われている属性を調べてみようと思います。

Pex Wizard で生成されたコード

// <copyright file="_Test.cs">Copyright &#169;  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:(省略形式は、/sf:) を オプションとして渡すと、実行する対象を絞ることが出来ます。

コマンドラインでは、こんな感じで指定します。

pex ClassLibrary1.Test.dll /sf:Hoge

Type Under Test とは、Test To Code Binding に載っています。
テスト対象の型を指定出来るようです。これを指定すると何か良い事があるのかな?未だ調べきれていません。


なんか長くなったので、他の属性は明日以降に書きます。

*1:実際試したところ、エラーが発生しました

*2:昔は、private はダメだった気がする