通過 Coverlet + ReportGenerator + Fine Code Coverage 產生測試涵蓋率報表

之前有介紹過 ReportGenerator,支援多種 Code Coverage 測試涵蓋率套件

今天要來介紹 Coverlet,他除了支援 Azure DevOps 的 ReportGenerator 輸出 html,還可以整合 VS IDE 的 Fine Code Coverage,不論是開發還是 CI 自動化都兼顧到了

開發環境

  • VS 2019 Enterpirse
  • Rider 2021.1.1
  • .NET 5

Coverlet 是 .NET 的跨平台代碼覆蓋框架,支援程式碼分支(if else)和方法覆蓋。它適用於 Windows 的 .NET Framework  和 .NET Core

Coverlet 三種整合方式

  • VSTest engine integration
  • MSBuild task integration
  • As a .NET Global tool (supports standalone integration tests)

只支援新版的 .NET Sdk 專案範本

VSTest engine integration

3.0.0 版本之後的收集器,支援

  • NET Core >= 2.0
  • .NET Framework >= 4.6.1

在測試專案安裝套件

dotnet add package coverlet.collector


Coverlet 整合 Visual Studio Test Platform data collector. 很簡單只要執行以下命令

dotnet test --collect:"XPlat Code Coverage"

 

它就會開始跑測試,把測試結果放在 coverage.cobertura.xml 檔案

更多進階的用法請參考:coverlet/VSTestIntegration.md at master · coverlet-coverage/coverlet (github.com)
 

MSBuild Integration

安裝

dotnet add package coverlet.msbuild

 

使用說明

在 dotnet test 接續參數,多個參數用分號隔開

/p:Exclude=\"[coverlet.*]*,[*]Coverlet.Core*\", /p:Include=\"[coverlet.*]*,[*]Coverlet.Core*\", or /p:CoverletOutputFormat=\"json,opencover\".

 

CoverletOutputFormat 支援格式:

  • json (default)
  • lcov
  • opencover
  • cobertura
  • teamcity

CoverletOutput:輸出位置,只需要指定路徑,副檔名會依據 CoverletOutputFormat 參數決定

 

Coverlet 整合 MsBuild. 很簡單只要執行以下命令,執行測試

dotnet test /p:CollectCoverage=true


在專案的跟目錄產生 coverage.json 涵蓋率報表

 

更多進階的用法請參考:coverlet/MSBuildIntegration.md at master · coverlet-coverage/coverlet (github.com)

.NET Global Tool

顧名思義就是安裝在本機全域,調用 coverlet 跑測試

安裝

dotnet tool install --global coverlet.console

 

範例

coverlet /path/to/test-assembly.dll --target "dotnet" --targetargs "test /path/to/test-project --no-build"


 

更多進階的用法請參考:coverlet/GlobalTool.md at master · coverlet-coverage/coverlet (github.com)
 

MS Build Integration ReportGenerator

跑完測試涵蓋率之後,還需要視覺化的 UI,這裡我選擇用上篇介紹過的 ReportGenerator 和 MsBuild

dotnet add package ReportGenerator

 

我想要跑完測試涵蓋率之後(GenerateCoverageResultAfterTest),產生報表,在專案檔加入以下 Target

<Target Name="GenerateHtmlCoverageReport" AfterTargets="GenerateCoverageResultAfterTest">
    <ItemGroup>
        <CoverageFiles Include="./results/coverage.cobertura.xml" />
    </ItemGroup>
    <ReportGenerator ReportFiles="@(CoverageFiles)" 
                     ProjectDirectory="$(MSBuildProjectDirectory)"
                     TargetDirectory="report" 
                     ReportTypes="Html;Badges"
                     HistoryDirectory="history"
                     AssemblyFilters="+Lab.DAL;" 
                     VerbosityLevel="Verbose" />
</Target>

 

執行以下命令

dotnet test /p:CollectCoverage=true /p:CoverletOutputFormat=cobertura /p:CoverletOutput="./results/"

 

產生出來的報表如下所示:

 

 

 

VS 2019 IDE Extensions

VS 2019 擴充工具 Fine Code Coverage 整合 Coverlet,安裝套件後,在 VS 設定找到它,畫面如下:

Global Options

叫出 Fine Code Coverage 視窗

執行所有測試

 

在測試專案的輸出資料 bin\net5.0\fine-code-coverage\coverage-tool-output 可以找到最後輸出的內容

 

這不就是 ReportGenerator 嗎 XDD

 通過 Fine Code Coverage  整合讓我們更容易使用涵蓋率報表了,如果你的 VS IDE 沒有測試涵蓋率這是一個不錯的選擇。

自動化整合

I[TFS 2015] 實作 Build vNext 自動部署 dotCover 測試涵蓋率網頁 | 余小章 @ 大內殿堂 - 點部落 (dotblogs.com.tw)

[Unit Test] 測試涵蓋率報表 - ReportGenerator | 余小章 @ 大內殿堂 - 點部落 (dotblogs.com.tw)

若有謬誤,煩請告知,新手發帖請多包涵


Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2019 .NET

Image result for microsoft+mvp+logo