【解決】 OpenCover で結果が取れない か nunit-agent がハングする

OpenCover で結果が取れない か nunit-agent がハングする - お だ のスペース の続きです。


コメントにて、「nunit-agent がハングする問題」の対応方法を教えて頂いたので、「Jenkins から実行して OpenCover の結果が取れない」についても調べて、無事解決しました。


まず、nunit-agent がハングする問題については、nunit-console.exe.config を編集すると直りました。
nunit-console.exe.config は NuGet でインストールした場合、〜\packages\NUnit.Runners.2.6.0.12051\tools にあります。

nunit-console.exe.config 一部抜粋

  <startup useLegacyV2RuntimeActivationPolicy="true">
    <!-- Comment out the next line to force use of .NET 4.0 -->
<!--    <supportedRuntime version="v2.0.50727" />  -->
    <supportedRuntime version="v4.0.30319" />
  </startup>

v2.0.50727 をコメントアウトします。useLegacyV2RuntimeActivationPolicy はこちらを参考に <startup> 要素
OpenCover は .NET4 で無いと動かないので、NUnit も 強制的に .NET4 の環境で動かすようにします。
nunit-agent.exe.config にも startup 要素はあるんですが、そこは何も編集しなくても良いです。nunit-agent は通常 nunit-console か nunit から呼ばれるのでそいつらに依存します。


続いて、Jenkins の job から実行すると OpenCover の結果が取れない問題について解決していきます。
エラーメッセージ (pdb が無いよ)で調べると、ここらへんが引っ掛かります。
Programmatically Speaking
State dependency on VC++ Redist Package in documentation · Issue #52 · sawilde/opencover · GitHub
しかし、Microsoft Visual C++ 2010 Redistributable Package は既にインストールしていましたし、修復インストールしても解決せず。
上のブログには、ドキュメントに VC++ 2010 Redistributable Package が必須って追加しといてよって話しだったのでドキュメントを読んでみる事に。
OpenCover も NuGet で入れている場合は、〜\packages\OpenCover.4.0.301\doc に Usage.rtf というドキュメントがあります。


この中の最後に「Why do I have no results?」という項目があり、中身はこんな感じの事が書かれています。

  1. 結果が取れないのは、filter の設定が間違ってるんじゃね?
  2. PDB が見つからないからじゃね?
    • NUnit を実行するときに Temp にコピーして実行するから、アセンブリPDB の場所が異なって見つからないのでは? /noshadow を指定して NUnit 実行したら?
    • もしくは、OpenCover を実行するときに、-targetdir を指定してみたら?


これについても

  • cmd から MSBuild 叩いた時は結果が取れているので、filter は正しいはず。
  • /noshadow も -targetdir を指定しても改善せず。

とお手上げムードだったんですが、「Why do I have no results?」のすぐ前に、「Build system integration」という項目が!
ビルド環境をシステムアカウントで実行するなら、レジストリに OpenCover.Profiler.dll 登録しとけよと書いてました。
というわけで、ドキュメントに通りに

regsvr32 x86\OpenCover.Profiler.dll
regsvr32 x64\OpenCover.Profiler.dll

を叩くと、Jenkins の job からでも OpenCover の結果が取れました!
前回 Windows7 の Jenkins だと job から実行しても問題無かったのは、Jenkins を Windows Service 化せずに実行していたからみたいですね。


というわけで、英語でもドキュメントをちゃんと読むようにしようと思いました。。