プログラムを中心とした個人的なメモ用のブログです。 タイトルは迷走中。
内容の保証はできませんのであしからずご了承ください。

2017/12/05

[C#] OpenCover でコードカバレッジを計測する

update2017/12/28 event_note2017/12/05 7:21

C# で作成したアプリケーションのカバレッジを、OpenCover を使って計測してみました。

環境

  • Visual Studio 2017 Community
  • OpenCover 4.6.519
  • ReportGenerator 3.0.2
  • .NET Framework 4.6.1
  • .NET Core 2.0

準備

OpenCover のインストール

NuGet でインストールします。

PM> Install-Package OpenCover

ReportGenerator のインストール

OpenCover で出力された xml を html に変換するため、ReportGenerator をインストールします。
こちらも NuGet でインストールします。

PM> Install-Package ReportGenerator

NuGet でインストールしたパッケージの場所

.NET Framework ではソリューションルートの package の中にあります。

.NET Core の場合、Windows 環境ではユーザーディレクトリ配下の以下の場所にあります。

%USERPROFILE%\.nuget\packages

Windows 環境以外では試していないのでよくわかりません。

OpenCover によるカバレッジ計測の実行

OpenCover は CLI で動作するツールです。
基本的な使い方は以下に記載されています。

OpenCover の出力形式は xml なので、カバレッジ計測後は ReportGenerator で HTML へ変換します。
しかし、codecov などと連携させる場合は ReportGenerator は不要なので、OpenCover と ReportGenerator とでバッチファイルを分けて、個別に実行できるようにしています。

MSTest の場合

MSTest を使用している場合、テストは MSTest を直接実行するのではなく、vstest をコールして実行します。

Visual Studio 2017 では vstest は以下にありました。

C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\CommonExtensions\Microsoft\TestWindow\vstest.console.exe

それを踏まえて、OpenCover でカバレッジを計測する場合、以下のように実行します。

rem OpenCover.bat
rem ソリューションルートで実行すること

rem MSTEST のインストール先
set MSTEST="C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\CommonExtensions\Microsoft\TestWindow\vstest.console.exe"

rem OpenCover のインストール先
set OPENCOVER=%1

rem 実行するテストのアセンブリ
set TARGET_TEST="MyApplication.Tests.dll"

rem 実行するテストのアセンブリの格納先
set TARGET_DIR=".\MyApplication.Tests\bin\Release"

rem OpenCover の出力ファイル
set OUTPUT=%2

rem カバレッジ計測対象の指定
rem set FILTERS="+[OpenCoverSample]*"
set FILTERS="+[*]*"

rem OpenCover の実行
%OPENCOVER% -register:user -target:%MSTEST% -targetargs:%TARGET_TEST% -targetdir:%TARGET_DIR% -filter:%FILTERS% -output:%OUTPUT%

OpenCover.bat "packages\OpenCover.4.6.519\tools\OpenCover.Console.exe" "coverage.xml"

.NET Core + xUnit の場合

.NET Core の場合、dotnet test で簡単にテスト可能なので、もうちょっとシンプルに書けました。

rem OpenCover.bat

rem OpenCover のインストール先
set OPENCOVER="%USERPROFILE%\.nuget\packages\opencover\4.6.519\tools\OpenCover.Console.exe"

rem テストコマンド
set TARGET="dotnet.exe"

rem テストコマンド引数
set TARGET_TEST="test MyApplication.Tests\MyApplication.Tests.csproj"

rem OpenCover の出力ファイル
set OUTPUT="coverage.xml"

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

rem OpenCover の実行
%OPENCOVER% -register:user -target:%TARGET% -targetargs:%TARGET_TEST% -filter:%FILTERS% -oldstyle -output:%OUTPUT%

Visual Studio 2017 の場合

Visual Studio 2017 でビルドした .NET Core および .NET Standard プロジェクトのコードカバレッジを計測したいときは、.csproj ファイルの PropertyGroup<DebugType>full</DebugType> を追加する必要があるらしいです。

ReportGenerator で HTML へ変換

OpenCover の出力は xml なので、HTML へ変換します。

rem ReportGenerator.bat
rem ソリューションルートで実行すること

rem ReportGenerator のインストール先
set REPORTGEN="packages\ReportGenerator.3.0.2\tools\ReportGenerator.exe"

rem OpenCover の出力ファイル
set OUTPUT="coverage.xml"

rem ReportGenerator の HTML 出力先
set OUTPUT_DIR="Coverage"

rem レポートの生成 (xml から html へ変換)
%REPORTGEN% -reports:%OUTPUT% -targetdir:%OUTPUT_DIR%

これを実行すると、Coverage に HTML ファイルが出力されます。

CI との連携

以下を参照してください。

参考 URL