やる気駆動型エンジニアの備忘録

WPF(XAML+C#)の話題を中心に.NET/Android/CI やたまに趣味に関するブログです

Jenkins でxUnit + OpenCover を使ったカバレッジ集計・レポート表示方法について

少し前にJenkins でxUnit を使ったユニットテストの実行方法を試しました。
iyemon018.hatenablog.com

今回は、Jenkins でxUnit でユニットテストを実行し、OpenCover を使ってカバレッジを集計・プロジェクトページに表示する方法についてメモします。

OpenCover について

結構昔?からあるコード カバレッジツールです。
github.com

昔からあると言いつつ、VS2017 に対応していたり、AppVeyor でも使えたり、.NET Core や.NET Framework 4.6.2 をサポートしていたりとかなり充実しています。
ライセンスはMIT です。

ReportGenerator について

ReportGenerator はユニットテストによって出力されたXMLレポートを様々な書式に変換するためのツールです。

  • OpenCover
  • PartCover
  • dotCover
  • Visual Sutidio
  • NCover

に対応しているみたいです。
github.com

こちらのライセンスはApache License 2.0 です。



いろいろなカバレッジツールを選んでいたのですが、"日本語情報が多い"、"開発が活発"な上記2つのツールを使用することにしました。

環境構築

それぞれ以下のページからインストーラーと実行ファイルをダウンロードします。

  • OpenCover

github.com

  • ReportGenerator

github.com

OpenCover はmsi で提供されているので、適当なフォルダにインストールします。

ReportGenerator はそのままでは実行できない場合があります。
まずはReportGenerator の配置先でReportGenerator.exe をダブルクリックして実行できるかどうか確認してください。
OS標準のメッセージが表示されて実行できない場合は"実行"ボタンをクリックすれば、それ以降はメッセージが表示されなくなります。
(このあたりは適当に操作していたためキャプチャやメッセージなどがありません。)

Jenkins でカバレッジを集計する

OpenCover のプラグインは無い(と思う)ので[ビルド] - [Windows バッチコマンドの実行] を選択します。
また、レポートファイルはワークスペースの特定フォルダ配下に作成するのがベターです。

cd %WORKSPACE%

::前回作成したデータを削除する。
rd /s /q %WORKSPACE%\Coverage
::今回のレポートデータ保存フォルダを作成する。
mkdir %WORKSPACE%\Coverage

::OpenCoverでカバレッジを集計する。
<OpenCoverインストールフォルダ>\OpenCover.Console.exe -register -target:"%WORKSPACE%\<xUnitのパッケージフォルダ>\xunit.console.exe" -targetargs:"%WORKSPACE%\<カバレッジのユニット テスト アセンブリ フォルダ>\<カバレッジ対象のアセンブリ>.dll" -targetdir:"%WORKSPACE%\<カバレッジ対象のアセンブリのPDBファイルが配置されているフォルダ>" -filter:"<フィルター条件>" -output:"%WORKSPACE%\Coverage\<カバレッジ結果ファイル名>"

::カバレッジの集計結果XMLとレポート出力先パスを指定する。
<ReportGeneratorの配置フォルダ>\ReportGenerator.exe "%WORKSPACE%\Coverage\<カバレッジ結果ファイル名>" .\Coverage\<カバレッジ結果レポート出力フォルダ名>

それぞれのツールのパラメータは以下のページに記述しています。

  • OpenCover

github.com

  • ReportGenerator

github.com

ちょっとハマった箇所
  • PDBファイルが無いと失敗する

当然のことなんですがPDBファイルが無いとコードの情報が無いためカバレッジを集計することができません。
Release のパスを指定していたので少しハマりました。
Debug モードでビルドして"-targetdir" にパスを指定しましょう。

  • 外部ライブラリもカバレッジ集計対象に含まれてしまう

NuGet で社内パッケージを使用していたのですが、このアセンブリカバレッジの集計に含まれてしまっていました。
"-filter" で除外するアセンブリを指定すると期待した動作になります。
例えばこんな感じ。

filter:"+[*]* -[*除外したいアセンブリ名*]*"

カバレッジ レポートを表示する

そのままではカバレッジ レポートをプロジェクト ページに表示することはできません。
[ビルド後の処理] - [Publish HTML reports] から生成したレポートページを表示するようにしましょう。

  • HTML directory to archive

上記で指定した"-output" のフォルダパスを設定します。

  • Index page[s]

"index.htm" を設定します。(多分固定)
ここは、".html" ではなく".htm" です。

  • Report title

レポートタイトルです。
複数のレポートを出力する場合はタイトルを分けておかないと同じページが表示されてしまいます。

レポート出力を表示すると通常はアセンブリレベルの調節やフィルターが表示されますが、Jenkins のセキュリティポリシーが設定されているとJavascript が実行されません。
そこで、[Jenkinsの管理] - [スクリプトコンソール] に以下のコードを入力して実行しましょう。
※ただし、このパラメータは再起動すると初期化されてしまうので起動オプションに設定しておきましょう

System.setProperty("hudson.model.DirectoryBrowserSupport.CSP", "")


Windowsバッチコマンドの設定が面倒ですが、一度作成してしまえばあとは自動化できるので楽ちんですね。