共用方式為


檢閱和設定 Azure Pipelines 中的程式碼涵蓋率結果

Azure DevOps 服務 |Azure DevOps Server |Azure DevOps Server 2022

程式碼涵蓋範圍可協助您判斷專案程式碼中實際正在測試的比例,例如透過單元測試。 為了增加您對程式碼變更的信心並有效防範錯誤,您的測試應該執行或涵蓋大部分程式碼。

當您檢閱程式碼涵蓋範圍結果時,您可以識別測試未涵蓋的程式碼路徑。 此資訊可協助您透過減少測試債務來逐步改善測試範圍。

本文說明如何在 Azure Pipelines 中檢視、設定及針對程式代碼涵蓋範圍進行疑難排解。 您將瞭解如何設定提取要求的差異涵蓋範圍、設定涵蓋範圍原則,以及解決常見問題。

備註

雖然您可以從 Azure Pipelines 支援的各種版本控制系統建置程式代碼,但本文中討論的提取要求功能的程式代碼涵蓋範圍目前僅適用於 Azure Repos。

支援的格式、工作和構件

支援的格式

Azure Pipelines 可以透過 [發佈程式代碼涵蓋範圍結果 v2] 工作來發佈涵蓋範圍結果。 工作可以在 2 個不同的檢視中顯示結果:

  • 對於 cobertura、jacoco、clover、gcov、pcov 及其他 xml 格式,會產生包含程式碼覆蓋率報告更多詳細資料的 HTML 檢視,這是大多數客戶的偏好。
  • For .coverage/.cjson/.covx – 產生表格式檢視,包含的詳細資料少於 HTML 檢視。

偽影和結果

您可以在管道運行摘要的 [摘要] 索引標籤下檢視建置期間發佈的程式碼涵蓋範圍成果。

螢幕擷取畫面顯示 [摘要] 索引標籤,其中包含手動執行和 2 個已發佈的專案。

此外,您可以在 程式碼涵蓋面 標籤中檢閱程式碼涵蓋面報告的結果:

螢幕擷取畫面顯示 [程式碼涵蓋範圍] 索引標籤內容,其中包含摘要、度量和涵蓋範圍。

  • 如果您使用 Cobertura 或 JaCoCo 涵蓋面格式發佈程式碼涵蓋面,則程式碼涵蓋面構件會包含一個 .html 檔案,您可以離線檢視該檔案以進行進一步分析。 螢幕擷取畫面顯示 HTML 報表摘要。
  • 針對 .NET 和 .NET Core,您可以在組建摘要中選擇程式碼涵蓋範圍里程碑,以存取下載成品的連結。
  • Visual Studio 測試 可以收集 .NET 和 .NET Core 應用程式的涵蓋範圍。 它會產生 .coverage 您可以下載並用於 Visual Studio 中進一步分析的檔案。 螢幕擷取畫面顯示程式碼涵蓋範圍結果。

任務

發佈程式代碼涵蓋範圍結果 會將程式代碼涵蓋範圍結果發佈至 Azure Pipelines,這些結果是由 CoberturaJaCoCo 格式的組建所產生。

Visual Studio Test.NET CoreAntMavenGulpGruntGradle 等內建工作提供將程式碼涵蓋範圍資料發佈至管線的選項。

Docker 注意事項

對於使用 Docker 的應用程式,您可以在容器內執行建置和測試,並在容器內產生程式碼涵蓋率結果。 若要將結果發佈至管線,請將產生的構件提供給 「發佈程式碼涵蓋範圍結果 」工作。 如需參考,請參閱 Docker 的建 置、測試和發佈結果 區 段下的類似範例,以使用 Docker 檔案發佈測試結果。

重要考慮

  • 在多階段 YAML 管線中,只有在整個管線完成之後,才能查看程式碼覆蓋率結果。 如果您想要在部署至生產環境之前檢閱程式碼涵蓋範圍結果,則可能需要將建置階段分隔成自己的管線。
  • 合併多個測試回合的程式碼涵蓋範圍結果目前僅適用於 .NET 和 .NET Core。 沒有計劃支持其他格式。

完整覆蓋率與差異覆蓋率

完整涵蓋範圍 會測量專案整個程式碼基底的涵蓋範圍。 在提取請求的內容中,開發人員專注於他們正在進行的更改,並想知道他們添加或更改的特定代碼行是否涵蓋在內。 這種類型的涵蓋範圍是 差異涵蓋範圍

涵蓋範圍設定 YAML 與 YAML 管線不同,因為涵蓋範圍設定會套用至您的存放庫,而且無論哪個管線建置您的程式碼,都會使用。 此區隔也表示,如果您使用以經典設計師為基礎的組建管線,您會取得拉取請求的程序碼涵蓋範圍狀態檢查。

涵蓋範圍指標會出現在已變更的檔案檢視中,而不論是否開啟拉取請求評論詳細資料。

設定差異覆蓋率

若要變更拉取請求程式碼覆蓋率體驗的預設設定,請包含在您存放庫根目錄中的名為 azurepipelines-coverage.yml 的配置 YAML 檔案。 在此檔案中設定所需的值,Azure DevOps 會在下次管線執行時自動使用它們。

您可以變更以下設定:

螢幕截圖顯示了您可以配置的設定。

範例設定

coverage:  
  status:                    # Code coverage status will be posted to pull requests based on targets defined below. 
    comments: on             # Off by default. When on, details about coverage for each file changed will be posted as a pull request comment.  
    diff:                    # Diff coverage is code coverage only for the lines changed in a pull request. 
      target: 60%            # Set this to a desired percentage. Default is 70 percent 

您可以在 程式碼涵蓋範圍 YAML 範例存放庫中找到更多具有詳細資料的範例。

涵蓋範圍狀態、詳細數據和指標

當您設定管線以收集和發佈程式碼涵蓋範圍時,它會在您建立提取要求時張貼程式碼涵蓋範圍狀態。 依預設,伺服器會檢查測試是否涵蓋至少 70% 的變更行。 您可以修改先前提到的目標參數,將差異涵蓋範圍臨界值目標變更為您選擇的值。

螢幕擷取畫面顯示涵蓋範圍狀態檢查失敗。

狀態檢查會計算拉取請求中所有檔案的差異覆蓋率。 若要查看每個檔案的百分比,請啟用 詳細資料 如上一節所述。 啟用後,系統會將詳細資訊作為評論發佈在 Pull Request 上。

螢幕擷取畫面顯示差異涵蓋範圍檢查失敗的結果。

在提取要求的已變更檔案檢視中,變更的行也會以涵蓋範圍指標進行註釋,以顯示這些行是否已涵蓋。

螢幕擷取畫面顯示提取要求行變更涵蓋範圍指標。

使用程式碼涵蓋範圍原則強制執行分支保護

根據預設,提取要求的程式碼涵蓋範圍狀態檢查是建議性的,它不會封鎖涵蓋範圍低的合併。 若要確保變更在合併之前符合最低涵蓋範圍臨界值,請設定使用涵蓋範圍狀態檢查的分支原則。

從管線張貼的程式代碼涵蓋範圍狀態遵循命名慣例 {name-of-your-pipeline/codecoverage}

備註

  • Azure Repos 中的分支原則(甚至是選擇性原則)會防止提取要求在失敗時自動完成。 此行為並非程式碼涵蓋範圍原則所特有。
  • 如果建置失敗,程式碼涵蓋範圍原則不會覆寫為 [失敗]。

疑難排解指南

為什麼我在 [程式碼涵蓋範圍] 索引標籤的涵蓋範圍檢視中看到重複的 DLL?

當管線中同時使用 .NET Core 和 .NET Framework 時,您可能會看到重複的 DLL。 當兩者同時使用時,預期會有重複的 DLL,這是設計使然,因為相同的模組來自不同的路徑。

為什麼 程式碼涵蓋面 標籤中沒有涵蓋面資料?

有幾個原因可能導致此問題:

  • 沒有測試或 DLL:如果檔案不包含測試或 DLL,則涵蓋範圍值為 0。 當涵蓋範圍值為 0 時,Azure DevOps 不會在索引標籤中顯示程式代碼涵蓋範圍數據。 相反地,它會在 [程式碼涵蓋範圍] 索引標籤下顯示一則訊息,說明為什麼沒有涵蓋範圍資料。

  • 空白涵蓋範圍 XML:當您使用「發佈程式碼涵蓋範圍」工作時,如果所提供的涵蓋範圍輸入不包含任何資訊或沒有任何程式碼行被涵蓋,則在標籤下不會顯示任何涵蓋範圍的資料。請檢查涵蓋範圍.xml 檔案(輸入檔案)為空或缺乏資訊的原因。

  • 建置失敗:如果建置失敗,則會出現程式碼涵蓋範圍索引標籤,並顯示適當的訊息。

  • VSTest 工作設定:當您使用 VSTest 工作時,如果您未啟用程式碼涵蓋範圍檢查,或您在 [測試篩選器] 欄位中提及不正確的 DLL 或測試檔案的路徑,則不會顯示涵蓋範圍資料。

  • 組建組態問題:有時存在多個組建組態值,而且您不會設定所有值,例如 BuildFlavour 或 BuildPlatform。 UI 只會顯示特定組建組態的值,這就是遺漏其他模組的原因。

  • 大型 HTML 檔案:如果檔案大於 7 MB,則報表在 [程式碼涵蓋範圍] 索引標籤中無法取得。因應措施是從摘要中的已發佈工件下載「Code Coverage Report_*」工件。

  • 失敗訊息:如果 [程式碼涵蓋範圍] 索引標籤包含與使用者特定錯誤相關的失敗訊息,請調查觸發該錯誤訊息的原因。

如果「程式碼涵蓋範圍狀態檢查」從未完成或失敗,我該怎麼辦?

若要啟用程式碼涵蓋範圍狀態檢查,請嘗試在存放庫的根目錄中新增 azurepipelines-coverage.yml 檔案。 確保檔案名稱保持完全相同。 以下為範例:

coverage: 
  status: 
    comments: on 
    diff: 
      target: 50% 

如果承保範圍狀態檢查失敗:

  1. 檢查差異覆蓋率。 如果小於目標,請嘗試增加差異覆蓋率百分比。
  2. 如果建置因任何原因而失敗,此失敗也可能導致程式碼涵蓋面狀態檢查失敗。
  3. 檢查哪個任務在流水線中產生涵蓋範圍檔案或報告。 驗證工作是否正確上傳覆蓋率報告或相關檔案。
  4. 差異涵蓋範圍註解顯示「無可執行的變更」或「找不到程式碼覆蓋資料」的情況,可能是因為行被移除、加入空白或新增註解所導致。 這些案例是不可執行的變更,而且並不重要,因此程式碼涵蓋範圍不會報告它們。

如何從程式代碼涵蓋範圍中排除某些 DLL?

若要從程式碼涵蓋範圍中排除檔案,請使用 ExcludeFromCodeCoverageAttribute 類別

如何透過合併多個摘要檔案來發佈具有適當詳細資料的程式碼涵蓋範圍摘要?

發佈程式碼涵蓋範圍 V1 工作不支援多個摘要檔案作為輸入。 請改用 [發佈程式碼涵蓋範圍 V2] 工作,其支援多種檔案格式。

您也可以使用 「報表產生器」工作 來合併所有 .xml 檔案,然後將產生的 XML 路徑作為輸入傳遞至「發佈程式碼涵蓋範圍」工作。

如何觸發程式碼涵蓋率檢查?

對於 .html 檔案,不支援涵蓋範圍狀態檢查。 使用「 建置品質檢查」作業 來檢查程式碼涵蓋面結果。

「程式碼涵蓋範圍」標籤上的報告包含不正確的數字

標籤上顯示的資料來自涵蓋範圍檔案。 如果您使用自訂工作來產生程式碼涵蓋範圍檔案,請檢查檔案是否遺漏任何 DLL 或檔案。

程式碼涵蓋範圍原則卡住,原因是什麼?

有幾個因素可能導致此問題:

  • 分支原則名稱格式不正確:確認管線名稱符合分支原則名稱,且沒有額外的字元。

    螢幕快照顯示 [政策] 索引標籤及被醒目提示的分支策略名稱,以確認其符合管線名稱。

  • 使用 PublishCodeCoverage V1:程式碼涵蓋範圍原則停滯,且不會產生註解。 請改用 PublishCodeCoverage V2 任務。

  • PR 中的檔案太多:如果 PR 有超過 100 個檔案,則涵蓋範圍原則會停滯。

  • 多個涵蓋範圍原則:如果您設定多個涵蓋範圍原則,其中一個原則會卡住。 僅配置一個政策,並刪除另一個卡住的政策。

即使在添加測試後,我也看到我的 PR 的 0% 差異覆蓋率

如果您為 PR 中修改或新增的程式碼行加入測試,但仍只看到 0% 的差異涵蓋率:

  1. 確認新新增的測試會在建置過程中執行。
  2. 如果測試未執行,請驗證並更新設定,以將其包含在組建中,因為如果測試未執行,則無法計算涵蓋範圍。

即使我看到正在發布的報導報告,我也沒有看到關於 PR 的差異報導評論

有幾個因素可能導致此問題:

  • 工作版本:只有 Publish Code Coverage V2 才支援差異涵蓋範圍註解。
  • 無可執行檔變更:針對具有可執行程式碼變更的檔案產生差異涵蓋範圍註解。 如果 PR 只有設定更新,Azure DevOps 可能會根據組建期間執行的所有測試來顯示程式代碼涵蓋範圍,但可能沒有任何差異涵蓋範圍要計算。
  • 涵蓋範圍格式:如果有功能程式碼變更,且未產生批註,請確認管線會以本文開頭所述的其中一種支援格式產生涵蓋範圍報告。

在 [程式碼涵蓋範圍] 索引標籤中,我看不到正確的 HTML 報表

當產生 .html 報告出現問題時,系統會退回至簡化模式。

螢幕擷取畫面顯示 [程式碼涵蓋範圍] 索引標籤和模組清單,以及涵蓋範圍圖表的視覺指示器,這是後援簡化檢視。

哪些涵蓋範圍工具和結果格式可用於驗證提取要求中的程式代碼涵蓋範圍?

目前,您只能使用 Visual Studio Code 涵蓋範圍 (.coverage) 格式來驗證提取要求的程式碼涵蓋範圍。 如果您使用 Visual Studio 測試工作、.NET Core 工作的測試動詞,以及 [發佈測試結果] 工作的 TRX 選項來發佈程式碼涵蓋範圍,請使用此格式。

如果在引發提取要求時觸發多個管線,涵蓋範圍是否會跨管線合併?

如果在引發提取要求時觸發多個管線,則不會合併程式碼涵蓋範圍。 此功能目前是針對單一管線所設計,以收集和發佈提取要求的程式碼涵蓋範圍。 如果您需要跨管線合併涵蓋範圍數據,請在 開發人員社群 提交功能要求。