使用coverlet統計單元測試的程式碼覆蓋率

單元測試是個好東西, 可以在一定程度上兜底

雖然寫單元測試這件事情非常麻煩

但是好的單元測試可以顯著提高程式碼品質, 減少bug, 避免無意中的修改導致其他模組出錯

寫測試用例的過程中, 靠人力去確保所有程式碼都被覆蓋是一件挺麻煩的事情

本文主要介紹如何在xunit下使用coverlet統計測試覆蓋率

環境介紹

系統: wsl2
編輯器: vscode
插件: C# + Coverlet + Coverage Gutters

程式碼

TestFunc.cs

public class TestFunc
{
    public static string Test1()
    {
        return "Test1";
    }
    public static string Test2()
    {
        return "Test2";
    }
}

測試程式碼:

[Fact]
public void Test1()
{
    Assert.True(TestFunc.Test1()=="Test1");
    Assert.False(TestFunc.Test1()=="Test2");
}

通過 dotnet test 運行後

只會顯示多少通過, 多少失敗, 並不知道哪些程式碼被覆蓋到了

顯示覆蓋率

修改csproj

首先需要修改單元測試項目的 csproj 文件

在開頭的 PropertyGroup 塊中添加

<CollectCoverage>true</CollectCoverage>
<CoverletOutputFormat>cobertura</CoverletOutputFormat>

用於生成測試的覆蓋報告 coverage.cobertura.xml

之後在 ItemGroup 中添加

<PackageReference Include="coverlet.msbuild" Version="3.1.0"/>

之後運行 dotnet test 測試

就會多顯示一些覆蓋率的內容

查看具體的覆蓋情況

安裝 Coverlet 和 Coverage Gutters 插件之後

進入被調用的文件內, 在vscode下方狀態欄中會顯示當前文件的覆蓋率情況

上圖為初始狀態

點擊這個 Watch 之後會開始解析 coverage.cobertura.xml

之後會顯示當前文件覆蓋率

同時編輯器窗口中也會通過比較顯眼的綠色(覆蓋)紅色(未覆蓋)標記覆蓋情況