共用方式為


使用程式代碼涵蓋範圍來判斷要測試多少程序代碼

若要判斷專案程式碼中經由測試的部分比例,例如單元測試,您可以使用 Visual Studio 的程式碼覆蓋率功能。 若要有效防範程式錯誤,您的測試應該執行或「涵蓋」大部分的程式碼。

受控(CLR)和非受控(native)程式代碼皆可進行程式代碼涵蓋率分析。 同時支援靜態和動態檢測。 若要在命令行案例中使用程式代碼涵蓋範圍,請使用 vstest.console.exeMicrosoft.CodeCoverage.Console 工具,這是 dotnet-coverage 的擴充功能,也支援原生代碼

當您使用 [測試總管] 執行測試方法時,[測試] 功能表下提供程式碼涵蓋範圍選項。 結果數據表會顯示在每個元件、類別和程式中執行之程式代碼的百分比。 來源編輯器會醒目提示已測試的程序代碼。 您可以使用 Cobertura 等熱門格式匯出結果。

要求

程式代碼涵蓋範圍功能僅適用於 Visual Studio Enterprise 版本。

注意

針對 .NET 程式代碼涵蓋範圍,您也可以使用命令行工具,dotnet-coverage

分析程式代碼涵蓋範圍

  1. 在 [測試] 功能表上,選取 [分析所有測試的程式代碼涵蓋範圍]

    強調顯示 [分析程式代碼涵蓋範圍] 的 [測試] 功能表螢幕快照。

    醒目提示 [分析程式代碼涵蓋範圍] 的 [測試] 功能表螢幕快照。

    提示

    您也可以從 測試總管 工具視窗執行程式代碼涵蓋範圍。

  2. 測試執行之後,若要查看哪些行已執行,請選擇Visual Studio 中 [分析程式代碼涵蓋範圍] 功能表的 [螢幕快照],[在 程式代碼涵蓋範圍 結果] 視窗中顯示程式代碼涵蓋範圍著色。 根據預設,測試所涵蓋的程式代碼會以淺藍色高亮顯示。

    螢幕快照,其中顯示突顯的程式代碼覆蓋率。

    螢幕快照,顯示標示出的程式代碼涵蓋範圍。

    在 [顯示程式代碼涵蓋範圍著色] 選項的下拉式清單中,您可以選取著色套用至程式代碼行、左邊界中的字元或兩者。

  3. 若要變更色彩或使用粗體臉部,請選擇 [工具]>[選項]>[環境]>[字型和色彩]>[顯示] 設定:[文本編輯器]。 在 [顯示專案]下,調整「涵蓋範圍」項目的設定,例如,[未接觸的區域]

    顯示程式代碼涵蓋範圍字型和色彩的螢幕快照

    顯示程式代碼涵蓋範圍字型和色彩的螢幕快照。

  4. 如果結果顯示涵蓋率低,請調查哪些部分的程式碼沒有被執行,並撰寫更多測試來測試這些部分。 開發小組通常會以大約80%的% 程式碼覆蓋率為目標。 在某些情況下,可以接受較低的涵蓋範圍。 例如,從標準範本產生某些程式代碼時,可以接受較低的涵蓋範圍。

提示

若要優化程式代碼涵蓋範圍:

  • 關閉編譯程序優化。
  • 如果您正在使用非受控原生程式碼,請使用除錯建置。
  • 為每個元件產生 .pdb 符號檔案。

如果您未取得預期的結果,請參閱 針對程式代碼涵蓋範圍進行疑難解答

更新程式碼後,別忘了再次執行測試涵蓋率。 在您修改程式代碼或執行測試時,涵蓋範圍結果和程式代碼著色不會自動更新。

提示

從 Visual Studio 2022 17.2 版開始,您可以選取 Tools > Options > Environment > Preview Features,然後選取 程式代碼涵蓋範圍體驗改善,然後重新啟動 Visual Studio,以啟用最新的程式代碼涵蓋範圍功能。

以區塊或行格式呈現的報告

程式代碼涵蓋範圍會計算在 區塊中,。 Block 是程式代碼的一部分,只有一個進入和結束點。 如果程式的控制流程在測試過程中通過某個區塊,則該區塊會被視為已涵蓋。 使用區塊的次數不會影響結果。

您也可以選擇數據表標頭中的 [新增/移除欄],來顯示欄的結果。 某些使用者偏好行數,因為百分比會更貼近您在原始程式碼中看到的片段大小。 即使它佔用許多行,計算的長區塊也會算為單一區塊。

提示

一行程式代碼可以包含一個以上的程式代碼區塊。 如果是這種情況,且測試運行會執行這一行中所有的程式碼區塊,則會計算為一行。 如果一行中部分但不是所有的程式碼區塊被執行,則計算為部分執行的行。

程式代碼涵蓋範圍結果檢視

程式代碼涵蓋範圍結果 視窗通常會在專案/類別/方法階層中建構報表。 您可以變更此選項,以顯示目錄/檔案/方法層級的涵蓋範圍。

  • 若要檢視來源報表,請在 [程式代碼涵蓋範圍結果] 視窗中,選取 [設定程式代碼涵蓋範圍檢視] 圖示。 然後,從 [報表形式] 的下拉式清單中選取 [來源檢視]。

程式代碼涵蓋範圍結果 視窗通常會顯示整個解決方案的結果。 您可以篩選結果,只顯示目前分支中已更新之檔案的結果。

  • 若要檢視變更集報表,請在 [程式代碼涵蓋範圍結果 ] 視窗中,選取 [設定程式代碼涵蓋範圍檢視] 圖示。 然後,從 [報表內容] 下拉式清單中選取 [變更集報表]。 更新使用中的存放庫和基底分支,以便進行比較並生成比較報告。

從 [程式代碼涵蓋範圍結果] 視窗中的搜尋方塊,可以用多種方式來篩選報表。

  • 若要依名稱 搜尋(僅顯示視窗中與搜尋字串匹配的項目),請在搜尋框中輸入搜尋字串。
  • 若要 依類型篩選 請在搜尋方塊中輸入類型的名稱。
  • 若要 [顯示所有 清除搜尋方塊。
  • 若要 顯示 100% 完整涵蓋,請在搜尋方塊中輸入 “Covered (%Lines)”:“100”。
  • 若要 顯示 (>0% && < 100%) 部分涵蓋的,請輸入 “Partially Covered (%Lines)”:“<##”,並將 ## 取代為涵蓋的百分比。
  • 若要 顯示 0% 涵蓋,請在搜尋方塊中輸入 「未涵蓋(%Lines)」:“0”。

管理程式碼覆蓋率結果

程式代碼涵蓋範圍結果 視窗通常會顯示最近執行的結果。 如果您變更測試數據,或每次只執行部分測試,結果會有所不同。

程式代碼涵蓋範圍結果 視窗也可用來檢視先前的結果,或在其他計算機上取得的結果。

您可以合併數個回合的結果,例如,使用不同測試數據的回合。

  • 若要檢視先前的一組結果,請從下拉功能表中選取它。 當您開啟新解決方案時,功能表中顯示的暫存清單會被清除。

  • 若要檢視上一個會話的結果,請選擇 [匯入結果]、流覽至方案中的 TestResults 資料夾,然後匯入 .coverage 檔案。

    如果原始程式碼自產生 .coverage 檔案之後變更,涵蓋範圍著色可能不正確。

  • 若要讓結果以文字讀取,請選擇 [匯出結果],選取 [.xml],[儲存為類型]。 這會產生可讀取的 .xml 檔案,您可以使用其他工具進行處理,或在郵件中輕鬆傳送。 您也可以選取導出格式,例如 Cobertura。

  • 若要將結果傳送給其他人,請傳送 .coverage 檔案或導出的 .xml 檔案。 然後,他們可以匯入檔案。 如果他們具有相同版本的原始程式碼,他們可以看到涵蓋範圍著色。

合併不同執行次數的結果

在某些情況下,會根據測試數據使用程序代碼中的不同區塊。 因此,您可能想要結合不同測試回合的結果。

例如,假設您在執行輸入 "2" 的測試時,發現有 50% 的特定函式被涵蓋。 當您使用輸入 「-2」 第二次執行測試時,您會在涵蓋範圍著色檢視中看到函式的其他 50 個% 涵蓋範圍。 現在您會合併兩個測試回合的結果,而報表和涵蓋範圍著色檢視會顯示已涵蓋函式的 100%。

在 [程序代碼涵蓋範圍] 視窗中,使用 [合併] 按鈕 圖示。合併結果 執行此動作。 您可以選擇最近執行或匯入結果的任何組合。 如果您想要合併匯出的結果,您必須先匯入它們。

使用 匯出結果 來儲存合併作業的結果。

合併的限制

  • 如果您合併不同版本的程式代碼涵蓋範圍數據,結果會個別顯示,但不會合併。 若要取得完全合併的結果,請使用相同的程式代碼組建,只變更測試數據。

  • 如果您合併匯出后匯入的結果檔案,您只能依行檢視結果,而不是依區塊檢視結果。 使用 [新增/移除資料行] 命令 以顯示行數據。

  • 如果您合併 ASP.NET 項目測試的結果,則會顯示個別測試的結果,但不會合併。 此行為僅適用於 ASP.NET 構件本身:其他元件的結果將會被合併。

從代碼覆蓋結果中排除元素

您可能想要從涵蓋範圍分數中排除程序代碼中的特定元素,例如,如果程式代碼是從文字範本產生。 將 System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverageAttribute 屬性新增至下列任何程式碼元素:類別、結構、方法、屬性、屬性 setter 或 getter、事件。

提示

排除類別並不會排除其衍生類別。

例如:

using System.Diagnostics.CodeAnalysis;
...
public class ExampleClass1
{
    [ExcludeFromCodeCoverage]
    void ExampleMethod() {...}

    [ExcludeFromCodeCoverage] // exclude property
    int ExampleProperty1
    { get {...} set{...}}

    int ExampleProperty2
    {
        get
        {
            ...
        }
        [ExcludeFromCodeCoverage] // exclude setter
        set
        {
            ...
        }
    }

}
[ExcludeFromCodeCoverage]
class ExampleClass2 { ... }

使用下列巨集:

ExcludeFromCodeCoverage( ExclusionName, L"FunctionName");

ExcludeSourceFromCodeCoverage( ExclusionName, L"SourceFilePath");

  • ExclusionName 是一個任何具有唯一性的名稱。

  • FunctionName 是一個完整的函式名稱。 它可能包含通配符。 例如,若要排除類別的所有函式,請寫入 MyNamespace::MyClass::*

  • SourceFilePath.cpp 檔案的本機或 UNC 路徑。 它可能包含通配符。 下列範例會排除特定目錄中的所有檔案:\\MyComputer\Source\UnitTests\*.cpp

  • #include <CodeCoverage\CodeCoverage.h>

  • 請將對排除用的巨集函數的呼叫放在全域命名空間中,而不要放在任何命名空間或類別內。

  • 您可以將排除項目放在單元測試檔案或應用程式檔案中。

  • 排除規則必須編譯為非受控(原生)程式碼,可以透過設定編譯選項或使用 #pragma managed(off)來實現。

注意

若要排除 C++/CLI 程式代碼中的函式,請將 屬性 [System::Diagnostics::CodeAnalysis::ExcludeFromCodeCoverage] 套用至 函式。 這與 C# 相同。

包含或排除其他元素

程式碼覆蓋率分析僅在已載入的元件上執行,並且在與 .dll.exe 檔案相同的目錄中必須有 .pdb 文件可用。 因此在某些情況下,您可以藉由取得適當 .pdb 檔案的複本,來擴充所包含的元件集。

您可以撰寫 .runsettings 檔案,以更有力地控制程式代碼涵蓋範圍分析中所選的組件和元素。 例如,您可以排除特定類型的元件,而不需要將屬性新增至其類別。 如需詳細資訊,請參閱 自訂程式代碼涵蓋範圍分析

分析 Azure Pipelines 中的程式代碼涵蓋範圍

當您簽入程式碼時,您的測試會在建置伺服器上執行,同時還會執行來自其他小組成員的測試。 在 Azure Pipelines 中分析程式代碼涵蓋範圍,以取得整個專案中涵蓋範圍最 up-to和完整的概觀,非常有用。 Azure Pipelines 中的程式代碼涵蓋範圍也包含自動化系統測試,以及您通常不會在開發電腦上執行的其他自動程式化測試。

從命令列分析程式代碼涵蓋範圍

若要從命令行執行測試,請使用 vstest.console.exe 公用程式。 程式代碼涵蓋範圍是 /EnableCodeCoverage 選項所叫用 vstest.console.exe 公用程式的選項。

  1. 啟動 Visual Studio 的開發人員命令提示字元:

    在 Windows \[開始\] 功能表中,搜尋 Developer Command Prompt for VS,然後選取與搜尋文字相關聯的應用程式結果。

  2. 在命令提示字元中,執行下列命令:

    vstest.console.exe MyTestAssembly.dll /EnableCodeCoverage
    

    小提示

    對於開發人員 PowerShell,Shell 的起始目錄是 Visual Studio 專案位置。 以路徑和測試檔名取代 MyTestAssembly.dll。 如需詳細資訊,請參閱 VSTest.Console.exe 命令行選項。

故障排除

如果您沒有看到程式代碼涵蓋範圍結果,疑難解答程式代碼涵蓋範圍 文章可能會協助您。