昨夜リリースされたばかりの Microsoft Code Digger をさっそくハックしてみました。
明け方の段階ではつかえねーコレだったのですが、ハックによってそこそこ使えるようになった感じです。
何ができる物ですか?
簡単に言えば Pex の低機能版です。一メソッドを選択し、コンテキストメニューから Generate Inputs / Outputs Table を行うとPexでの動作パスの列挙および、その動作パスに入るパラメータ値、そのパラメータでの呼び出し結果がリストアップされます。
public class Class1
{
public int Test( int x,int y)
{
checked
{
return x/y;
}
}
}
というTestAddを Generate Inputs/Outputs すると以下のように表示されます。

UI上ではそれだけです。これ以上の何もできません。
結果が気に入らなければコードを直せば良い、気に入ったならそのコードで良いんでしょ。別にすることないよねって鼻くそをホジってる感じです。
何ができない物ですか?
Code Digger 単体ではこのコードが将来に渡って同一の結果を返し続けるように保障する事はできません。
この一覧を元に単体テストを作って、ビルドサーバでそれを実行するようにすればそれはきっと実現する事ができるでしょう。Pexにはそれは備わっていましたが Code Digger には含まれません。
実際の所として現状追認のテストコードが一杯できるだけで、Pexでのテストコード生成は決して便利とは言いきれなかったのですが、それにしてもバッサリ切ってしまわれるとちょっとアレです。
カッとなってハックした
というわけで、Code Digger の出力をちょっと眺めてみたらテストコード自体は生成しているという事が解ったので、それを元に C# での単体テストコードを再構成する T4 テンプレートを書いてみました。
現物ファイルは gist にあります。
https://gist.github.com/kazuk/5449781
ファイルをダウンロードしたうえで Code Digger と組み合わせて使ってみましょう。
ポータブルクラスライブラリと単体テストのプロジェクトを作ります。

デフォルト名でビシバシひどいですが、こんなもんです。
足し算では単調すぎるので、割り算でやってみましょう。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace PortableClassLibrary1
{
public class Class1
{
public int Test( int x,int y)
{
checked
{
return x/y;
}
}
}
}
というコードに対して

という結果が得られました。
さっきの gist から取ってきたttを単体テストプロジェクトに突っ込みます。
最初の <#@ assembly #>の行を
<#@ assembly name=”$(SolutionDir)\PortableClassLibrary1\bin\Debug\PortableClassLibrary1.dll”#>
と書き換えて保存します。
普通に C# ソースが吐かれますが、一部エラーとなっているはずで、TODOコメントがいくらか出ていると思います。
// info PexFrameworkDir = C:\Users\kazuk\AppData\Local\Microsoft\VisualStudio\11.0\Extensions\z2qe4t0q.wnk
// TODO: add reference Microsoft.Pex.Framework.dll to this Project. path shown previous line
TODOの二つ目が上記内容です。どこにインストールされるかはちょっと予想がつかないので、パスが表示されています。ここにある Microsoft.Pex.Framework.dll を参照設定してください。(ソースコードを共有している場合に人様が自分のAppData\Local を参照できないとかで困らないようにソリューション内の適当な場所にコピーする等気は使って下さいね。)
これでエラーは消えるはずです。
もう一つのTODOである名前空間まで調整すれば特にもうする事はありません。
テストは生成されていますので、実行してみましょう。

もともとCode Digger で失敗したよと表示されているテストは失敗するように生成されました。
テストをいじったのにT4 から再生成されては意味がないので、ソースコードをまっとうなファイル名を付け替えて保存すれば完了です。
最後に例外で失敗してる所とかをそれを望むなら PexRaisedExceptionのtypeof通りに ExpectedException で想定通りと言い聞かせればいいでしょう。
注意事項
複数の Code Digger の結果が残ってると一気に生成するので生成メソッドが重複する事があります。bin\Debug配下にreportsとして結果は出ていますので、不要な物は適宜削除するか、さっくりデバッグしたい時などは名前空間を変える等で重複をごまかしておけば良いんじゃないかな。
まとめ
普通に使うにはちょっと機能不足な気もするけど、機能が無いならハックすれば良いじゃないで何とかなってみました。
Pex は楽しいツールなんでうまく使って下さい。ではでは!ハッピーな開発を!