當前位置: 妍妍網 > 碼農

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

2024-04-24碼農

引言

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

核心元件

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

什麽是 Coverlet

Coverlet GitHub 上的開源計畫,可為 C# 提供跨平台程式碼覆蓋率框架, Coverlet .NET Foundation 的一部份, Coverlet 收集 Cobertura 覆蓋率測試執行數據,用於生成報表。

什麽是 ReportGenerator ?

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

程式碼覆蓋率實戰

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

  • 建立 xUnit 測試計畫 然後看一下 csproj XML

  • <ItemGroup>
    <PackageReferenceInclude="coverlet.collector"Version="6.0.0" />
    <PackageReferenceInclude="Microsoft.NET.Test.Sdk"Version="17.8.0" />
    <PackageReferenceInclude="xunit"Version="2.5.3" />
    <PackageReferenceInclude="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 [3] 等大家可以自行選擇

    下面用命令列來演示一下

    導航到 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 工具生成報表,我們可以將覆蓋率數據轉換為易讀的報表形式,幫助團隊更直觀地了解測試覆蓋情況,進一步最佳化測試策略和提高程式碼品質。

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

  • 單元測試程式碼覆蓋率 [4]

  • 本文完整原始碼 [5]

  • 參考資料

    [1]

    Coverlet : https://github.com/coverlet-coverage/coverlet

    [2]

    ReportGenerator : https://github.com/danielpalme/ReportGenerator

    [3]

    netconfig: https://dotnetconfig.org/

    [4]

    單元測試程式碼覆蓋率: https://learn.microsoft.com/zh-cn/dotnet/core/testing/unit-testing-code-coverage?tabs=windows

    [5]

    本文完整原始碼: https://github.com/Dong-Ruipeng/dotNetParadise-xUnit