Pex 楽しいよ!

以前 時間が出来たら調べること - お だ のスペース で名前だけ紹介した Pex ですが、やっと少しだけ試してみました。感想は、めっちゃすげ〜、楽しい!
Pex がどんなツールかというと、実装しているコードに対して、高いコードカバレッジのテストケースを生成してくれるツールです。
Pex, Automated White box Testing for .NET - Microsoft Research
ダウンロードに MSDN Subscription が必要となっていますが、非商用利用ならコマンドライン用の物がダウンロード出来ます。
※本来は、Visual Studio のアドインとして、VS上から実行出来る。
今回は無料で作れる環境で試してみました。
・Visual C# 2010 Express
NUnit 2.5.6
・Academic Release Pex v0.92.50603.1


まず、Class Libraryプロジェクトを作成し次の様な足し算と割り算を行うクラスを作り、ビルドします。

using System;

namespace ClassLibrary2
{
  public class Class1
  {
    public int add(int a, int b)
    {
      return a + b;
    }

    public int divide(int a, int b)
    {
      if (b == 0)
        throw new ArgumentOutOfRangeException("b は 0ダメ!");
      return a / b;
    }
  }
}

割り算は、0除算はダメなので上記の様な実装にしています。一見これで正しそうな実装に見えますよね?
では、こいつに対して Pex からテストコードを作成してみましょう。
コマンドプロンプト を立ち上げて、後で楽をするために、Pex にパスを通します。そしてビルドして出来た dll があるディレクトリーに移動します。

作成した環境によって異なるので、適宜変更して下さい。

set path=%PATH%;"C:\Program Files (x86)\Microsoft Pex\bin"
cd %USERPROFILE%\Documents\Visual Studio 2010\Projects\ClassLibrary2\ClassLibrary2\bin\Release

では、Pex を使ってテストケースを作成してみましょう。
とは言ったものの、ドキュメント/ヘルプは英語だらけでコマンドラインでのチュートリアルは見つからないので挫折しかかったんですが、
Microsoft Pex Reference Manual に Pex Wizard が載っていたので助かりました!
pexwizard というツールがあるようで、こいつで Pex で使うテストプロジェクト - テストコード 一式を自動で作成してくれる様です。では試してみましょう。

pexwizard ClassLibrary2.dll /testf:NUnit

/testf:NUnit は TestFramework は NUnit を使いますよというオプション指定です。詳しくは、help を参照して下さい。

実行後

pexwizardproject というディレクトリーが作成されています。この中に、テストプロジェクトやテストコード、コンパイル済みのテストプロジェクト.dll が作成されています。

テストプロジェクト.dll があるディレクトリーまで移動します。

cd pexwizardproject\bin\Debug

ここに、ClassLibrary2.Tests.dll が作成されています。こいつに対して、Pex を実行します。

pex ClassLibrary2.Tests.dll


実行すると、

そして、ブラウザが起動し実行結果が表示されます。
※実行結果は、report というディレクトリーに作成されています。

辿っていくと…

この実装では、OverflowException が発生するケースがある様です。
そういえば、System.Int32.MaxValue は、2,147,483,647 で System.Int32.MinValue は -2,147,483,648 なので、int.MinValue / -1 は OverflowException が発生します。
これは見落としやすいケースでは無いでしょうか?


とまぁこんな感じで、高いカバレッジ率のテストケースを自動生成してくれますよ!というツールみたいです。
どうですか、面白そうじゃないですか?
チュートリアル等を見ていると、VS は Professional 以上で、MS Test が使えないとダメみたいな印象を受けましたが、ちゃんと Express Edition の VS と NUnit でも実行出来ます。
試すだけなら、無料で使えるので是非一度お試しを!

ちなみに注意点として、
x86 でコンパイルした物でないと、Pex は使えない様です。