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 との連携
以下を参照してください。