引言
在前幾章我們深度講解了單元測試和整合測試的基礎知識,這一章我們來講解一下程式碼覆蓋率
,程式碼覆蓋率是單元測試執行的度量值
,覆蓋率通常以百分比表示,用於衡量程式碼被測試覆蓋的程度,幫助開發人員評估測試用例的質量和程式碼的健壯性。常見的覆蓋率包括語句覆蓋率(Line Coverage
)、分支覆蓋率(Branch Coverage
)、路徑覆蓋率(Path Coverage
)等,不同型別的覆蓋率可以幫助開發人員更全面地瞭解測試用例對程式碼的覆蓋情況,從而改進測試策略和提高程式碼質量。
核心元件
本文介紹如何透過 Coverlet
在單元測試中使用程式碼覆蓋率和使用 ReportGenerator
生成報表。
什麼是Coverlet
?
Coverlet
是GitHub
上的開源專案,可為C#
提供跨平臺程式碼覆蓋率框架,Coverlet
是.NET Foundation
的一部分,Coverlet
收集Cobertura
覆蓋率測試執行資料,用於生成報表。
什麼是ReportGenerator
?
ReportGenerator
將由Cobertura
生成的覆蓋率報表轉換為各種格式的使用者可讀的報表。
程式碼覆蓋率實戰
我們在之前的專案中建立了Sample.Api
和Sample.Repository
用作我們單元測試和整合測試的Demo
專案,接下來我們用這個專案來做一下單元測試覆蓋。
- 建立
xUnit
測試專案
然後看一下csproj
的XML
檔案
<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
可以看到我們專案基本成型了,但是Copy
過來的程式碼還是我們dotNetParadise.DependencyInjection
測試依賴注入時那個類庫。
一個小tips
:
滑鼠點選我們的測試專案dotNetParadise.CodeCoverage
->右鍵->同步名稱空間
可以看到我們的名稱空間已經被正確替換
同步名稱空間功能
-
使用時機: 你想要透過將檔案拖動到新資料夾重構部分解決方案。
-
操作原因: 你想要確保你的名稱空間中的新資料夾結構保持最新。
開始統計
我們可以透過CMD
命令進入測試專案類庫的內
然後執行下面這個命令
dotnet test --collect:"XPlat Code Coverage"
"XPlat Code Coverage"
引數是與Coverlet
中的資料收集器對應的易記名稱。 此名稱是必需的,但不區分大小寫。 若要使用.NET
的內建程式碼覆蓋率資料收集器,請使用"Code Coverage"
。
看一下執行完控制檯輸出
透過控制檯反饋我們得知了,生成了一個附件路徑在
~\TestResults\2515646c-5845-4bfb-ae14-7e0bf4617b84\coverage.cobertura.xml
作為
dotnet test
執行的一部分,生成的coverage.cobertura.xml
檔案輸出到TestResults
目錄 。 該XML
檔案包含結果。 這是一個依賴於.NET CLI
的跨平臺選項,非常適用於不可使用MSBuild
的生成系統。
簡單解讀一下
cobertura.xml
程式碼覆蓋率報告,提供了關於程式碼單元測試覆蓋率的詳細資訊。其中包含了各種指標和資料,如以下幾點:
line-rate
和branch-rate
分別表示語句覆蓋率和分支覆蓋率,均為 0.5,表示被測試覆蓋的比例為 50%。lines-covered
和lines-valid
分別表示被覆蓋的程式碼行數和總程式碼行數。branches-covered
和branches-valid
分別表示被覆蓋的分支數和總分支數。- 在具體的類和方法級別,提供了各自的覆蓋率、複雜度等資訊,以及每行程式碼的覆蓋情況(
hits
表示執行次數,branch
表示是否為分支語句,condition-coverage
表示條件覆蓋率)。
生成報告
上面提到了coverlet.collector
是用來收集單元測試的指標的真正的報告是用 ReportGenerator
生成。
第一步要將 ReportGenerator
NuGet
包安裝為 .NET
全域性工具
dotnet tool install -g dotnet-reportgenerator-globaltool
有很多種生成報告的方法如 命令列,新增netconfig等大家可以自行選擇
下面用命令列來演示一下
導航到coverage.cobertura.xml
xml 報告檔案下
reportgenerator -reports:"coverage.cobertura.xml" -targetdir:"coveragereport" -reporttypes:html
輸出:
檢視測試報告:
我的路徑:
TestResults\b5595744-2bb9-42ab-8c2e-60d544b4b04f\coveragereport
最後
透過建立測試專案並使用 Coverlet
進行程式碼覆蓋率統計,我們可以得到詳細的覆蓋率報告。生成的 coverage.cobertura.xml
檔案提供了各種指標和資料,如語句覆蓋率、分支覆蓋率等,幫助開發團隊評估程式碼的測試覆蓋情況。
隨後,透過 ReportGenerator
工具生成報表,我們可以將覆蓋率資料轉換為易讀的報表形式,幫助團隊更直觀地瞭解測試覆蓋情況,進一步最佳化測試策略和提高程式碼質量。
透過以上實踐,我們能夠更有效地利用程式碼覆蓋率工具,提升單元測試的質量和效率,從而構建更健壯的軟體系統。
😄歡迎關注筆者公眾號一起學習交流,獲取更多有用的知識~
- 單元測試程式碼覆蓋率
- 本文完整原始碼