TFS2012 自動ビルドでのNUnit テストの結果が OpenCover カバレッジを計測できない(回避策発見)

※対応方法をまとめました→TFS2012 自動ビルドで NUnit テストのカバレッジ結果を OpenCover で計測する #tfsug - kaji_3's blog

Premium からなら、コードカバレッジが取得できますが買う事ができないため OpenCover でカバレッジを計測しようとしてます。以前のエントリ(NUnit の OpenCover レポートを作成する - kaji_3's blog)で Visual Studio でビルドした結果に対し OpenCover を利用した場合、正常にレポート出力できましたが、TFSでの自動ビルド結果ではうまくいきませんでした。

環境

  • 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

現象

VisualStudio2012でビルドした結果に対し、OpenCoverを実行するとレポートが作成されるが、
TFS2012ビルドサービスでビルドした結果に対し、OpenCoverを実行すると以下のエラーが出力される。

TFSの自動ビルドで出力されたライブラリに対し NUnit でテストを行い OpenCoverでレポートを作成しようとすると以下のエラーがでます。

Execution Runtime: net-3.5
.....
Tests run: 5, Errors: 0, Failures: 0, Inconclusive: 0, Time: 0.2241488 seconds
  Not run: 0, Invalid: 0, Ignored: 0, Skipped: 0
Committing...
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)

調査

TestResultsフォルダをテスト対象にする方法(参考:TFSのビルドプロセスにOpenCoverのカバレッジ計測を組み込む(前半) - Yasuo's Notebook)と回避できるもよう。

しかし、TFS2010,MSTestの場合は、TestResultsフォルダが作成され、Outフォルダ内のアセンブリが出力されるようだが、出力されない。
(出力されない原因がTFS2012なのか、NUnitなのかは未検証)

成功条件と失敗条件

  • ビルドは成功したが、以下のメッセージが出て格納フォルダへのコピー時エラーになった場合、既にビルドされているアセンブリに対しては、カバレッジが計測できる。
変更セットと作業項目を関連付ける
例外メッセージ: TF270016: ログ ファイルを 'C:\Builds\1\kaji\PhotoShare_MainBuild\Sources\PhotoShare\PhotoShare.log' から '\\altavista3\TFSworkdddd\PhotoShare_MainBuild\PhotoShare_MainBuild_20121004.1\logs' に発行するときにエラーが発生しました。詳細: ネットワーク名が見つかりません。
 (種類 PublishLogFileException)
例外スタック トレース:    場所 System.Activities.Statements.Throw.Execute(CodeActivityContext context)
   場所 System.Activities.CodeActivity.InternalExecute(ActivityInstance instance, ActivityExecutor executor, BookmarkManager bookmarkManager)
   場所 System.Activities.Runtime.ActivityExecutor.ExecuteActivityWorkItem.ExecuteBody(ActivityExecutor executor, BookmarkManager bookmarkManager, Location resultLocation)

推測として、この後の処理「変更セットと作業項目を関連付ける」以降で pdb ファイルに「何か」が変更が加えられて OpenCover で実行ができなくなってしまうのではないか。

対応案

ビルドプロセスでの「変更セットと作業項目を関連付ける」の前の「プロジェクトに MSBuild を実行する」完了直後に OpenCover を実行するプロセスを追加、することで解決しようと思います。対応策が実現できたら、別エントリ作成の上、ここに反映します。