C# の単体テストのコードカバレッジの結果をWeb形式で出力する

# はじめに

本稿は、C#の単体テストのコードカバレッジの結果をWeb形式で出力する手順の紹介です。
以下の Microsoft の公式ページをもとに私が確認した内容を説明します。
[単体テストにコードカバレッジを使用する](https://docs.microsoft.com/ja-jp/dotnet/core/testing/unit-testing-code-coverage?tabs=windows)

ざっくり要点を説明すると、__Coverlet というカバレッジの計測結果を出力する nuget ライブリを使って XML ファイルを出力してから、ReportGenerator という .NET ツールでその XML ファイルを入力に HTML ファイルのレポートページを出力します。__
上記はコマンドラインで実行できます。

# カバレッジの出力手順

## 対象のプログラム

以下のクラスをテスト対象とします。

```cs
namespace ConsoleAppSample.Samples
{
	public class Person
	{
		public string Name { get; private set; } = string.Empty;

		public void ChangeName(string name)
		{
			Name = name;
		}

		public int GetNameLength()
		{
			return Name.Length;
		}
	}
}
```

上記クラスをテストするためのテストクラスを以下とします。

```cs
namespace ConsoleAppSampleTest
{
    public class PersonTest
    {
        [Fact]
        public void ChangeNameTest()
        {
            var person = new Person();
            person.ChangeName("xxx");

            Assert.Equal("xxx", person.Name);
        }
    }
}
```

上記のテストクラスのテストフレームワークは、xUnit を利用しています。
C#の有名なテストフレームワークは、MSTest、NUnit、xUnitの3つがありますが、以下の記事の通り xUnit が人気なので、本稿では xUnit を利用します。

https://qiita.com/kojimadev/items/c451196fb703cbf99e86

## レポートの出力手順

### coverlet.collector で XML ファイルを出力

まず、単体テスト用のプロジェクトに、[coverlet.collector](https://www.nuget.org/packages/coverlet.console) というライブラリを nuget からインストールします。
(テストフレームワークに xUnit を利用している場合は、既定でインストールされています)

coverlet.collector をインストールしたら、以下のコマンドをコマンドプロンプトから実行して、カバレッジの結果をXML形式で出力します。
ちなみに、Visual Studio のメニューから [表示] - [ターミナル] で表示するウィンドウからでも実行できます。
`dotnet test --collect:"XPlat Code Coverage"`

上記のコマンドが成功すれば、以下のファイルパスにカバレッジの結果が記載されたXMLファイルを出力します。
`{テストプロジェクトのファイルパス}\TestResults\{guid}\coverage.cobertura.xml`

### ReportGenerator で HTML ファイルを出力

次に、[ReportGenerator](https://www.nuget.org/packages/dotnet-reportgenerator-globaltool) というツールを用いて HTML ファイルを出力します。
そのために、以下のコマンドで、.NET グローバル ツールとして ReportGenerator をインストールします。
`dotnet tool install -g dotnet-reportgenerator-globaltool`

Reportgenerator をインストールしたら、以下のコマンドで、coverlet.collector が出力した XML ファイルを入力に HTML ファイルのレポートページを出力します。
`reportgenerator -reports:"{テストプロジェクトのファイルパス}\TestResults\{guid}\coverage.cobertura.xml" -targetdir:"coveragereport" -reporttypes:Html`

上記のコマンドが成功すると、ソリューションフォルダの直下に `coveragereport` というフォルダが作成され、その中に HTML ファイルのレポートページが作成されます。

## レポートページの内容

出力したレポートページの例を記します。
図のように、アセンブリ数、クラス数、メソッド数、テストでカバーしている行数、カバーしていない行数などのメトリクスを記した表と、クラスごとのカバレッジを記した表があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403606/fcc0324f-bbe7-9f7b-6709-0b1e740f493b.png)

上図で、クラス名のリンクをクリックすると、そのクラスのメトリクスを表示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403606/89b58483-7aff-18f0-e462-17f7e9e05dcd.png)

さらにスクロールすると、ソースコードが表示されて、カバーしている行とカバーしていない行がどこなのか分かります(カバーしていない行にマウスホバーすると Not Covered と表示されます)。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403606/0613b81d-60a4-b4f0-7038-d3029a1061a3.png)

その他、ReportGenerator についての詳細は公式ページを参照ください。
https://github.com/danielpalme/ReportGenerator

# まとめ

C#の単体テストのコードカバレッジの結果をWeb形式で出力する手順を紹介しました。
CIと連携するのも良さそうです。

ちなみに私は、普段はエンジニアリングマネージャーとして、チームの皆で楽しく開発する施策を色々実施しています。詳しくは以下を参照ください。

https://qiita.com/kojimadev/items/4b28f801863cf4e8f0da

Twitterでも開発に役立つ情報を発信しています → [@kojimadev](https://twitter.com/kojimadev)