はじめに
.NET Core で Code Coverage を利用する方法です。テストフレームワークは xUnit.net を使います。
検証した環境は以下の通り。(カバレッジは Enterprise じゃないと使えないはず)
Visual Studio Enterprise 2017 (15.4.0)
.NET Core 2.0
プロジェクトの作成
クラスライブラリを作成します。
同じソリューションにテストプロジェクトも作成します。
テストプロジェクトにはクラスライブラリへの参照を追加しておきます。
NuGet Package の追加とアップデート
パッケージマネージャーコンソールを開いて、以下のコマンドを実行します。
Update-Package
Install-Package Microsoft.CodeCoverage -ProjectName UnitTests
テストプロジェクトは以下のようになります。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp2.0</TargetFramework>
<IsPackable>false</IsPackable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.CodeCoverage" Version="1.0.3" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.3.0" />
<PackageReference Include="xunit" Version="2.3.1" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.3.1" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\ApplicationCore\ApplicationCore.csproj" />
</ItemGroup>
</Project>
テストメソッドの追加
クラスライブラリにテスト対象のメソッドを追加します。
using System;
namespace ApplicationCore
{
public class Class1
{
public int Add(int x, int y)
{
return x + y;
}
}
}
テストプロジェクトにテストメソッドを追加します。
using System;
using Xunit;
using ApplicationCore;
namespace UnitTests
{
public class UnitTest1
{
[Fact]
public void Test1()
{
var sut = new Class1();
Assert.Equal(5, sut.Add(2, 3));
}
}
}
DebugType の変更
クラスライブラリの DebugType を Full にします。現時点では Full でないとカバレッジが利用できません。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp2.0</TargetFramework>
<DebugType>Full</DebugType>
</PropertyGroup>
</Project>
Working with code coverage
temporary workaround と書いてあるので、そのうち不要になるのかも。
分析の実行
[テスト] - [コードカバレッジの分析] - [すべてのテスト] を実行します。テストが実行され、コードカバレッジの結果が表示されます。
コマンドラインからの実行
コマンドラインから実行する場合は、テストプロジェクトのアセンブリを指定して実行します。結果はカレントディレクトリの TestResults フォルダ 配下に出力されます。出力された .coverage ファイルは Visual Studio に読み込ませて確認できます。
vstest.console.exe --collect:"Code Coverage" --framework:".NETCoreApp,Version=v2.0" "C:\Source\CoverageSample\UnitTests\bin\Debug\netcoreapp2.0\UnitTests.dll"
まとめ
Visual Studio Enterprise は高いんですよねぇ。。。カバレッジぐらいは Professional とか Community でも使えるようにしてほしい。