TFS2012 自動ビルドで NUnit テストのカバレッジ結果を OpenCover で計測する #tfsug

TFS2012 自動ビルドでのNUnit テストの結果が OpenCover カバレッジを計測できない(回避策発見) - kaji_3's blog で実現できず困っていましたが、解決したので対応方法をまとめます。

環境

  • Windows8
  • VisualStudio2012
  • TFS2012
  • ReportGenerator.1.6(NuGet)
  • OpenCover.4.0.804(NuGet)
  • NUnit 2.6.1
  • TFS2012ビルドサービスのユーザは「TFSBuildUser」を使っている
  • TFSBuildUser は Administrators に所属
  • Windows8にVisualStudio2012とTFS2012をインストールしている
  • 以下のコマンドでレジストリへの登録済み
regsvr32 x86\OpenCover.Profiler.dll
regsvr32 x64\OpenCover.Profiler.dll

目的

NUnitのカバレッジを計測したかったのですが Premium を買ってもらうことができないため、OpenCoverを利用します。

前提

自動ビルド終了後に OpenCover を実行するとなぜか以下のようなメッセージが出力されます。

No results - no assemblies that matched the supplied filter were instrumented
    this could be due to missing PDBs for the assemblies that match the filter
    please review the output file and refer to the Usage guide (Usage.rtf)

原因は、ビルド後に行うテストによって pdb ファイルが OpenCover で参照できない状態になると推測していますが、ビルドプロセスの「何か」は特定ができていません。

そのため、ビルド直後に OpenCover を実行する処理をビルドプロセスに追加します。

手順

ビルドバッチの作成

前回(NUnit の OpenCover レポートを作成する - kaji_3's blog)作成したものから、ビルドサービス実行ユーザにインストールした OpenCover、ReportGeneratorのインストール先に変更しました。
また、TFSのビルドでバイナリが出力される先でテストを実行するようにしています。
(参考TFSのビルドプロセスにOpenCoverのカバレッジ計測を組み込む(前半) - Yasuo's Notebook

rem NUnitのインストール先
set nunit_home=C:\Program Files (x86)\NUnit 2.6.1

rem OpenCoverのインストール先
set opencover_home=C:\Users\TFSBuildUser\Documents\Visual Studio 2012\Projects\PhotoShare\packages\OpenCover.4.0.804

rem ReportGeneratorのインストール先
set reportgen_dir=C:\Users\TFSBuildUser\Documents\Visual Studio 2012\Projects\PhotoShare\packages\ReportGenerator.1.6.0.0

rem パスの設定
set path=%path%;%opencover_home%;%reportgen_dir%\

rem 実行するテストのアセンブリ
set target_test=PhotoShare.Domain.Tests.dll

rem 実行するテストのアセンブリの格納先
set target_dir=C:\Builds\1\KiritoFramework\PhotoShare_MainBuild\Binaries\PhotoShare

rem カバレッジ計測対象の指定
set filters=+[PhotoShare*]*

rem カレントディレクトリをアセンブリの場所に移動
cd %target_dir%

rem OpenCoverの実行
OpenCover.Console -register:user -target:"%nunit_home%\bin\nunit-console.exe" -targetargs:"/nologo %target_test%"  -output:result.xml -mergebyhash  -filter:"%filters%"

rem レポートの生成
ReportGenerator "result.xml" html
ビルドプロセスの編集

ビルドプロセスの編集方法の詳細が乗っているのでそちらを。。
TFSのビルドプロセスにOpenCoverのカバレッジ計測を組み込む(後半) - Yasuo's Notebook

OpenCover実行プロセスの追加

前提に記述した事が原因で、ビルド、テストの最後にOpenCoverを実行するとエラーになります。そのため追加する場所をビルド直後にします。
具体的には、

  • コンパイルとテスト
    • プロジェクトのコンパイルを試す
      • プロジェクトのコンパイル
        • プロジェクトに MSBuild を実行する

の直下にしてください。こんな感じで。
f:id:kaji_3:20121004011123j:plain

ビルドサービスで実行

「実行するテストのアセンブリの格納先」のフォルダにレポートが作成されます。