單元測試必備:Asp.Net Core程式碼覆蓋率實戰,打造可靠應用 !

董瑞鹏發表於2024-04-23

引言

在前幾章我們深度講解了單元測試和整合測試的基礎知識,這一章我們來講解一下程式碼覆蓋率,程式碼覆蓋率是單元測試執行的度量值,覆蓋率通常以百分比表示,用於衡量程式碼被測試覆蓋的程度,幫助開發人員評估測試用例的質量和程式碼的健壯性。常見的覆蓋率包括語句覆蓋率(Line Coverage)、分支覆蓋率(Branch Coverage)、路徑覆蓋率(Path Coverage)等,不同型別的覆蓋率可以幫助開發人員更全面地瞭解測試用例對程式碼的覆蓋情況,從而改進測試策略和提高程式碼質量。

核心元件

本文介紹如何透過 Coverlet 在單元測試中使用程式碼覆蓋率和使用 ReportGenerator 生成報表。

什麼是Coverlet

CoverletGitHub 上的開源專案,可為 C# 提供跨平臺程式碼覆蓋率框架,Coverlet.NET Foundation 的一部分,Coverlet 收集 Cobertura 覆蓋率測試執行資料,用於生成報表。

什麼是ReportGenerator?

ReportGenerator 將由 Cobertura 生成的覆蓋率報表轉換為各種格式的使用者可讀的報表。

程式碼覆蓋率實戰

我們在之前的專案中建立了Sample.ApiSample.Repository用作我們單元測試和整合測試的Demo專案,接下來我們用這個專案來做一下單元測試覆蓋。

  • 建立xUnit測試專案
    然後看一下csprojXML檔案
  <ItemGroup>
    <PackageReference Include="coverlet.collector" Version="6.0.0" />
    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0" />
    <PackageReference Include="xunit" Version="2.5.3" />
    <PackageReference Include="xunit.runner.visualstudio" Version="2.5.3" />
  </ItemGroup>

從上面可以看出xUnit的測試專案已經預設對coverlet.collector新增了支援

我們在講解在單元測試中使用依賴注入時,用Sample.Repository做的單元測試,我們把之前的程式碼Copy一份,到新的測試專案,新增和講解依賴注入時一樣的配置。

然後新增對我們Sample.Repository的專案引用

NuGet\Install-Package Xunit.DependencyInjection -Version 9.1.0
NuGet\Install-Package Xunit.DependencyInjection.Logging -Version 9.0.0

image

可以看到我們專案基本成型了,但是Copy過來的程式碼還是我們dotNetParadise.DependencyInjection測試依賴注入時那個類庫。

一個小tips

滑鼠點選我們的測試專案dotNetParadise.CodeCoverage->右鍵->同步名稱空間

image

可以看到我們的名稱空間已經被正確替換

同步名稱空間功能

  • 使用時機: 你想要透過將檔案拖動到新資料夾重構部分解決方案。

  • 操作原因: 你想要確保你的名稱空間中的新資料夾結構保持最新。

開始統計

我們可以透過CMD命令進入測試專案類庫的內

image

然後執行下面這個命令

dotnet test --collect:"XPlat Code Coverage"

"XPlat Code Coverage" 引數是與 Coverlet 中的資料收集器對應的易記名稱。 此名稱是必需的,但不區分大小寫。 若要使用 .NET 的內建程式碼覆蓋率資料收集器,請使用"Code Coverage"

看一下執行完控制檯輸出

image

透過控制檯反饋我們得知了,生成了一個附件路徑在
~\TestResults\2515646c-5845-4bfb-ae14-7e0bf4617b84\coverage.cobertura.xml

作為 dotnet test 執行的一部分,生成的 coverage.cobertura.xml 檔案輸出到 TestResults 目錄 。 該 XML 檔案包含結果。 這是一個依賴於 .NET CLI 的跨平臺選項,非常適用於不可使用 MSBuild 的生成系統。

image

簡單解讀一下
cobertura.xml程式碼覆蓋率報告,提供了關於程式碼單元測試覆蓋率的詳細資訊。其中包含了各種指標和資料,如以下幾點:

  • line-ratebranch-rate 分別表示語句覆蓋率和分支覆蓋率,均為 0.5,表示被測試覆蓋的比例為 50%。
  • lines-coveredlines-valid 分別表示被覆蓋的程式碼行數和總程式碼行數。
  • branches-coveredbranches-valid 分別表示被覆蓋的分支數和總分支數。
  • 在具體的類和方法級別,提供了各自的覆蓋率、複雜度等資訊,以及每行程式碼的覆蓋情況(hits 表示執行次數,branch 表示是否為分支語句,condition-coverage 表示條件覆蓋率)。

生成報告

上面提到了coverlet.collector是用來收集單元測試的指標的真正的報告是用 ReportGenerator生成。

第一步要將 ReportGenerator NuGet 包安裝為 .NET 全域性工具

dotnet tool install -g dotnet-reportgenerator-globaltool

image

有很多種生成報告的方法如 命令列,新增netconfig等大家可以自行選擇

下面用命令列來演示一下

導航到coverage.cobertura.xmlxml 報告檔案下

reportgenerator -reports:"coverage.cobertura.xml" -targetdir:"coveragereport" -reporttypes:html

輸出:

image

檢視測試報告:

我的路徑:
TestResults\b5595744-2bb9-42ab-8c2e-60d544b4b04f\coveragereport

image

最後

透過建立測試專案並使用 Coverlet 進行程式碼覆蓋率統計,我們可以得到詳細的覆蓋率報告。生成的 coverage.cobertura.xml 檔案提供了各種指標和資料,如語句覆蓋率、分支覆蓋率等,幫助開發團隊評估程式碼的測試覆蓋情況。

隨後,透過 ReportGenerator 工具生成報表,我們可以將覆蓋率資料轉換為易讀的報表形式,幫助團隊更直觀地瞭解測試覆蓋情況,進一步最佳化測試策略和提高程式碼質量。

透過以上實踐,我們能夠更有效地利用程式碼覆蓋率工具,提升單元測試的質量和效率,從而構建更健壯的軟體系統。

😄歡迎關注筆者公眾號一起學習交流,獲取更多有用的知識~
image

  • 單元測試程式碼覆蓋率
  • 本文完整原始碼

相關文章