Visual Studioの外部ツール機能でOpenCoverを呼び出す方法(カバレッジ測定、ASP.NET編)

### オープンソースのカバレッジ測定ツール(.NET)の簡単な使い方と、外部ツールに登録して利用する方法を解説します。

VisualStudioはEnterprise版であればカバレッジを測定できますが、料金が高く個人で利用できる値段ではありません。
代替策として、オープンソースで利用できる`OpenCover`と、レポート変換ツール`ReportGenerator`を利用し外部ツールから呼び出せるように設定します。

※下記の方法はASP.NETを対象としています。[.exe編はこちら](https://qiita.com/murasuke/items/3b5ee94d2cf08dba54ce)です。

### 利用ツール

* [OpenCover-https://github.com/OpenCover/opencover](https://github.com/OpenCover/opencover)
* [ReportGenerator-https://github.com/danielpalme/ReportGenerator](https://github.com/danielpalme/ReportGenerator)

## OpenCoverとReportGeneratorをインストールします

NuGetでインストールします

```
PM> Install-Package OpenCover
PM> Install-Package ReportGenerator
```

* Visual Studioで適当なプロジェックトを作り`ツール`メニューから`ソリューションのNuGetパッケージの管理`を選んでインストールしても大丈夫です(%USERPROFILE%\.nuget\packages\にインストールされます)

メニューからパッケージの管理画面を開きます。
![Nuget-pm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276579/ba4cdce8-564a-fe3c-1a62-c5b757a7b38c.png)

パッケージ検索画面で検索して、両ツールを追加してください。
![NuGet-OpenCover.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276579/7d39353a-1943-ec11-219b-bf3dc583c306.png)

## 最低限必要なコマンドラインの説明

### OpenCover

| 引数 | 説明 | 例 |
|-----------|------------|:------------|
|-target:<ターゲットパス>  | カバレッジ計測対象のexeパス。<br>ASP.NETを利用する場合はIISExpressのパスを指定します。 |-target:"C:\Program Files\IIS Express\iisexpress.exe" |
|-targetargs:<-targetに引き渡す引数>  |IISExpressに引き渡す引数。/path:でルートフォルダを指定します。/portは未指定の場合8080です。 | -targetargs:"/path:C:\WebRoot /port:"8081"" |
|-searchdirs:<PDF検索パス>  |.PDFファイルを検索する追加フォルダ |-searchdirs:"C:\WebRoot\bin" |
|-output:<出力ファイル(xml)>|計測結果を保存するパス(xml)|-output:"C:\WebRoot\obj\results.xml" |
|-register[:user]|プロファイラへの登録で利用するユーザを指定。管理者権限がない場合、userを指定すれば良いようです|-register:user|
|-mergeoutput]|指定した場合、前回の出力結果にマージします|-mergeoutput|

### ReportGenerator

| 引数 | 説明 | 例 |
|-----------|------------|------------|
|-reports:<OpenCover出力ファイル(xml)>  | OpenCoverで出力した測定結果ファイル(xml) |-reports:"C:\WebRoot\obj\results.xml" |
|-reporttypes:<出力タイプ>|Html,HtmlInline,MarkdownSummaryなど選択できます|-reporttypes:HtmlInline; |
|-targetdir:<出力先>|レポートファイル出力先|-targetdir:"C:\WebRoot\obj"|


## 外部ツールへの登録

Visual Studioの`ツール`⇒`外部ツール`で上記ツールを呼び出せるように登録します。

## OpenCover(asp.NET)

![external-opencover_aspnet.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276579/1e3a7031-dfd9-5ed7-6c15-f27e75668664.png)

インストールしたOpenCoverのバージョンに合わせて変更してください。

* 初期ディレクトリ`$(TargetDir)`を指定し、引数は相対パスで指定します(コマンドの文字列制限を回避するためです)

| 引数 | 説明 | 
|-----------|------------|
| タイトル| OpenCover(ASP.NET)| 
| コマンド |%USERPROFILE%\.nuget\packages\opencover\4.7.1221\tools\OpenCover.Console.exe| 
| 引数 |-target:"C:\Program Files\IIS Express\iisexpress.exe" -targetargs:"/path:$(ProjectDir)" -searchdirs:"." -output:"reports.xml" -register:user| 
| 初期ディレクトリ |$(TargetDir)| 

## ReportGenerator

![external-reportgen.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276579/45d28a14-2a24-92ce-1ccb-d3d3b9e81997.png)

インストールしたReportGeneratorのバージョンに合わせて変更してください。

| 引数 | 説明 | 
|-----------|------------|
| タイトル| ReportGenerator| 
| コマンド | %USERPROFILE%\.nuget\packages\\reportgenerator\4.8.10\tools\net47\ReportGenerator.exe| 
| 引数 | -reports:"\$(TargetDir)reports.xml" -reporttypes:HtmlInline; -targetdir:"\$(TargetDir)" |

## 実行方法と出力サンプル

1. ソリューションエクスプローラーから計測対象のプロジェクトのファイルを開き(\$(TargetDir)に影響)、登録したツール(`OpenCover`)を実行します。
1. ブラウザから、IISExpressのコンソールに表示されたURLを開きます。
1. コンソール上で「q」キーを押すか、タスクトレイからIISExpressを終了します。
1. プログラムを終了させた後`ReportGenerator`を実行します。 
1. 処理完了後、出力先(-targetdir:)に`index.html`ができているので開きます。

### 出力サンプル

[Visual Studioの外部ツール機能でOpenCoverを呼び出す方法(カバレッジ測定、.exe編)](https://qiita.com/murasuke/items/3b5ee94d2cf08dba54ce#%E5%87%BA%E5%8A%9B%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB)でご確認ください。