TFSのビルドプロセスにOpenCoverのカバレッジ計測を組み込む(前半)
前回のエントリでカバレッジ計測ツールのOpenCoverを紹介しました。
今回は、TFSのビルドプロセスにOpenCoverの実行を組み込んで、カバレッジ計測が行えるようにする方法を紹介したいと思います。
まずは、TFSのビルドで作成されるアセンブリに対してカバレッジ計測を行うためのバッチファイルを作成します。
ビルド対象はOpenCoverの紹介で使用したサンプルとします。
前回のエントリで作成したバッチファイルを流用します。
この格納先を変更する必要があります。
rem 実行するテストのアセンブリの格納先set target_dir=C:\Users\ユーザ名\Documents\Visual Studio 2010\Projects\OpenCoverSample\OpenCoverSampleTest\bin\Debug
TFSのビルドで作成されるアセンブリは以下に格納されます。
C:\Builds\1\(コレクション名)\(プロジェクト名)\Binaries
今回の例で、私の環境では以下のディレクトリになります。
C:\Builds\1\TFSTry\OpenCoverSample\Binaries
上記のtarget_dirにC:\Builds\1\TFSTry\OpenCoverSample\Binariesを設定するようにバッチファイルを変更して実行してみます。
OpenCoverSampleTest.dll を読み込んでいます... 実行を開始しています... Cannot instrument C:\Builds\1\TFSTry\OpenCoverSample\Binaries\OpenCoverSample.dl l as no PDB could be loaded Cannot instrument C:\Builds\1\TFSTry\OpenCoverSample\Binaries\OpenCoverSample.dl l as no PDB could be loaded 結果 トップ レベルのテスト -- ----------- 成功 OpenCoverSampleTest.UnitTest1.func1Test 1/1 テスト 成功
「実行を開始しています...」の下に「Cannot instrument・・・」とエラーメッセージが出てしまいます。
色々と試してみたのですが、C:\Builds\1\(コレクション名)\(プロジェクト名)\TestResults\の下に生成される日付時刻付きの名称のディレクトリの下にあるアセンブリを指定するとうまくいくことが判りました。
日付時刻によって変わってしまいますが、私の環境では以下のようなディレクトリになります。
C:\Builds\1\TFSTry\OpenCoverSample\TestResults\SYSTEM_マシン名 2011-12-31 22_49_04_Any CPU_Debug\Out
解決方法は判ったのですが、日付時刻で変わるディレクトリをどうにかして指定する必要があります。TFSのビルド時の動作を確認すると、ビルド時にC:\Builds\1\TFSTry\OpenCoverSample\以下のディレクトリを削除して作り直しています。
つまり、TestResultsの下にあるフォルダはSYSTEM_マシン名 YYY-MM-DD HH_MM_DD_Any CPU_Debugが1つだけであると保証されます。そこでバッチファイルを工夫してみました。
rem 実行するテストのアセンブリの格納先 set target_dir=C:\Builds\1\TFSTry\OpenCoverSample\TestResults\SYSTEM*\Out
このようにディレクトリの日付部分を*で記載します。
rem カレントディレクトリをアセンブリの場所に移動 cd %target_dir%
こんな感じでカレントディレクトリを移動させます。cdコマンドは
ディレクトリに*を指定できます。今回はディレクトリが1つしかないので
確実に生成されたディレクトリに移動することができます。
最終的なバッチファイルは以下のようになりました。
rem VS2010のインストール先 set vs2010_home=C:\Program Files (x86)\Microsoft Visual Studio 10.0 rem OpenCoverのインストール先 set opencover_home=C:\Program Files (x86)\OpenCover rem 実行するテストのアセンブリ set target_test=OpenCoverSampleTest.dll rem 実行するテストのアセンブリの格納先 set target_dir=C:\Builds\1\TFSTry\OpenCoverSample\TestResults\SYSTEM*\Out rem レポート生成ツールのインストール先 set reportgen_dir=C:\Tools\ReportGenerator_1.2.3.0 rem カバレッジ計測対象の指定 set filters=+[OpenCoverSample]* rem パスの設定 set path=%path%;%opencover_home%;%reportgen_dir%\bin rem カレントディレクトリをアセンブリの場所に移動 cd %target_dir% rem OpenCoverの実行 OpenCover.Console -register:user -target:"%vs2010_home%\Common7\ide\mstest.exe" -targetargs:"/noisolation /testcontainer:%target_test%" -filter:"%filters%" -output:result.xml -mergebyhash rem レポートの生成 reportgenerator "result.xml" %reportgen_dir%\html
今回の例は、バッチファイルはプロジェクト毎に作るようになっていますがTFS側でうまくコマンドライン引数を渡せば、色々なプロジェクトで共有のバッチファイルも作成することができると思います。
次回は、TFSのビルドプロセステンプレートを編集して今回作成したバッチファイルを実行する方法を紹介できたらと思います。