はじめに
本稿は、C#の単体テストのコードカバレッジの結果をWeb形式で出力する手順の紹介です。
以下の Microsoft の公式ページをもとに私が確認した内容を説明します。
単体テストにコードカバレッジを使用する
ざっくり要点を説明すると、Coverlet というカバレッジの計測結果を出力する nuget ライブリを使って XML ファイルを出力してから、ReportGenerator という .NET ツールでその XML ファイルを入力に HTML ファイルのレポートページを出力します。
上記はコマンドラインで実行できます。
カバレッジの出力手順
対象のプログラム
以下のクラスをテスト対象とします。
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;
}
}
}
上記クラスをテストするためのテストクラスを以下とします。
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 を利用します。
レポートの出力手順
coverlet.collector で XML ファイルを出力
まず、単体テスト用のプロジェクトに、coverlet.collector というライブラリを nuget からインストールします。
(テストフレームワークに xUnit を利用している場合は、既定でインストールされています)
coverlet.collector をインストールしたら、以下のコマンドをコマンドプロンプトから実行して、カバレッジの結果をXML形式で出力します。
ちなみに、Visual Studio のメニューから [表示] - [ターミナル] で表示するウィンドウからでも実行できます。
dotnet test --collect:"XPlat Code Coverage"
上記のコマンドが成功すれば、以下のファイルパスにカバレッジの結果が記載されたXMLファイルを出力します。
{テストプロジェクトのファイルパス}\TestResults\{guid}\coverage.cobertura.xml
ReportGenerator で HTML ファイルを出力
次に、ReportGenerator というツールを用いて 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 ファイルのレポートページが作成されます。
レポートページの内容
出力したレポートページの例を記します。
図のように、アセンブリ数、クラス数、メソッド数、テストでカバーしている行数、カバーしていない行数などのメトリクスを記した表と、クラスごとのカバレッジを記した表があります。
上図で、クラス名のリンクをクリックすると、そのクラスのメトリクスを表示します。
さらにスクロールすると、ソースコードが表示されて、カバーしている行とカバーしていない行がどこなのか分かります(カバーしていない行にマウスホバーすると Not Covered と表示されます)。
その他、ReportGenerator についての詳細は公式ページを参照ください。
https://github.com/danielpalme/ReportGenerator
まとめ
C#の単体テストのコードカバレッジの結果をWeb形式で出力する手順を紹介しました。
CIと連携するのも良さそうです。
ちなみに私は、普段はエンジニアリングマネージャーとして、チームの皆で楽しく開発する施策を色々実施しています。詳しくは以下を参照ください。
Twitterでも開発に役立つ情報を発信しています → @kojimadev