Yasuo's Notebook

ソフトウェア開発の話題が中心の備忘録です。

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のビルドプロセステンプレートを編集して今回作成したバッチファイルを実行する方法を紹介できたらと思います。