在 Visual Studio 中撰寫 C/C++ 的單元測試

您可以使用 [測試總管] 視窗來撰寫及執行 C++ 單元測試。 它的運作方式就像對其他語言所做的一樣。 如需使用測試總管的詳細資訊,請參閱使用測試總管執行單元測試

注意

C++ 不支援 Live Unit Testing、自動程式化 UI 測試和 IntelliTest 等某些功能。

Visual Studio 隨附這些 C++ 測試架構,無需額外下載:

  • 適用於 C++ 的 Microsoft 單元測試架構
  • Google Test
  • Boost.Test
  • CTest

您可以使用已安裝的架構,或針對您想要在 Visual Studio 中使用的任何架構撰寫自己的測試配接器。 測試配接器會將單元測試與 [測試總管] 視窗整合。 Visual Studio Marketplace 上提供幾個協力廠商配接器。 如需詳細資訊,請參閱安裝協力廠商單元測試架構

Visual Studio 2017 和更新版本 (Professional 與 Enterprise)

C++ 單元測試專案支援 CodeLens

Visual Studio 2017 及更新版本 (所有版本)

  • Google Test 配接器隨附作為 [使用 C++ 的桌面開發] 工作負載的預設元件。 它有一個專案範本,您可以將其新增到解決方案中。 以滑鼠右鍵按一下 [方案總管] 中的方案節點,然後選擇快捷方式功能表上的 [新增>新增專案] 以新增專案範本。 它也有一些您可以透過 [工具>選項] 進行設定的選項。 如需詳細資訊,請參閱如何:在 Visual Studio 中使用 Google Test

  • Boost.Test 隨附作為 [使用 C++ 的桌面開發] 工作負載的預設元件。 它已與 [測試總管] 整合,但目前沒有專案範本。 它必須手動設定。 如需詳細資訊,請參閱如何:在 Visual Studio 中使用 Boost.Test

  • CTest 支援已隨附於 [使用 C++ 的桌面開發] 工作負載之一部分的 [C++ CMake 工具] 元件。 如需詳細資訊,請參閱如何:在 Visual Studio 中使用 CTest

舊版 Visual Studio

您可以在 Visual Studio Marketplace 上下載 Google Test 配接器和 Boost.Test 配接器延伸模組。 可在「適用於 Boost.Test 的測試配接器」「適用於 Google Test 的測試配接器」中找到它們。

基本測試工作流程

下列各節說明協助您開始使用 C++ 單元測試的基本步驟。 Microsoft 和 Google Test 架構的基本組態類似。 Boost.Test 需要您手動建立測試專案。

在 Visual Studio 2022 中建立測試專案

在一或多個測試專案內定義並執行單元測試。 測試專案會建立一個單獨的應用程式,以呼叫可執行檔中的程式碼並報告其行為。 在與您要測試的程式碼相同的解決方案中建立測試專案。

若要將新的測試專案新增至現有的解決方案,請

  1. 以滑鼠右鍵按一下 [方案總管] 中的 [方案] 節點。
  2. 在快顯功能表中,選擇 [新增>新增專案]。
  3. [語言] 設為 C++,然後在搜尋方塊中鍵入 "test"。 下圖顯示安裝 [使用 C++ 進行桌面開發] 及 [UWP 開發] 工作負載後,可使用的測試專案:

C++ Test Projects in Visual Studio 2022

在 Visual Studio 2019 中建立測試專案

在一或多個測試專案內定義並執行測試。 在與您要測試的程式碼相同的解決方案中建立專案。 若要將新的測試專案新增至現有的解決方案,請

  1. 以滑鼠右鍵按一下 [方案總管] 中的 [方案] 節點。
  2. 在快顯功能表中,選擇 [新增>新增專案]。
  3. [語言] 設為 C++,然後在搜尋方塊中鍵入 "test"。 下圖顯示安裝 [使用 C++ 進行桌面開發] 及 [UWP 開發] 工作負載後,可使用的測試專案:

C++ Test Projects in Visual Studio 2019

在方案中建立其他專案的參考

若要啟用對受測專案中函式的存取,請在測試專案中新增對該專案的參考。 以滑鼠右鍵按一下 [方案總管] 中測試專案節點,以顯示快顯功能表。 選擇 [新增>參考]。 在 [新增參考] 對話方塊中,選擇您要測試的專案。

Add reference

如果測試程式碼未匯出您想要測試的函式,請將輸出 .obj.lib 檔案新增至測試專案的相依性。 如需詳細資訊,請參閱若要將測試連結至物件或程式庫檔案。 請勿包含具有 main 函式或其他標準進入點 (例如 wmainWinMainDllMain) 的物件檔案。 當您將新的來源檔案新增至專案時,請更新測試專案相依性以包含對應的物件檔。

針對標頭檔新增 #include 指示詞

接下來,在單元測試的 .cpp 檔中,針對宣告您要測試之類型和函式的任何標頭檔,新增一個 #include 指示詞。 輸入 #include ",然後 IntelliSense 會啟動來協助您做選擇。 針對任何更多的標頭重複此動作。

Screenshot of the Solution Explorer showing an #include directive being added with IntelliSense highlighting a header file for inclusion.

若要避免在來源檔案中的每個 include 陳述式中輸入完整路徑,請在 [專案>屬性>C/C++>一般>其他 Include 目錄] 中新增必要的資料夾。

撰寫測試方法

注意

本節說明適用於 C/C++ 的 Microsoft 單元測試架構語法。 相關文件如下:Microsoft.VisualStudio.TestTools.CppUnitTestFramework API 參考。 如需 Google Test 文件,請參閱 Google Test primer (Google Test 入門)。 如需 Boost.Test,請參閱 Boost Test library: The unit test framework (Boost Test 程式庫:單元測試架構)。

測試專案中的 .cpp 檔案有一個為您定義的存根類別和方法。 它們會顯示如何撰寫測試程式碼的範例。 這些簽章使用 TEST_CLASS 和 TEST_METHOD 巨集,因此可從 [測試總管] 視窗探索方法。

Screenshot of the Test Explorer window that shows the unittest1.cpp code file containing a stub class and method using the TEST_CLASS and TEST_METHOD macros.

TEST_CLASS 和 TEST_METHOD 是 Microsoft 原生測試架構的一部分。 測試總管以類似的方式來探索其他支援架構中的測試方法。

TEST_METHOD 傳回 void。 若要產生測試結果,請使用 Assert 類別中的靜態方法,以針對預期的結果測試實際結果。 在下列範例中,假設 MyClass 具有接受 std::string 的建構函式。 此範例示範了如何測試建構函式是否按照您期望的方式初始化類別:

TEST_METHOD(TestClassInit)
{
    std::string name = "Bill";
    MyClass mc(name);
    Assert::AreEqual(name, mc.GetName());
}

在上述範例中,Assert::AreEqual 呼叫的結果會判斷測試成功或失敗。 Assert 類別包含許多其他方法可用來將預期結果與實際結果進行比較。

您可以將「特徵」新增至測試方法中以指定測試擁有者、優先順序和其他資訊。 接著可以使用這些值來排序及分組測試總管中的測試。 如需詳細資訊,請參閱使用測試總管執行單元測試

執行測試

  1. 在 [測試] 功能表上,選擇 [Windows]>[測試總管]。 下圖顯示其測試尚未執行的測試專案。

    Test Explorer before running tests

    注意

    目前無法將 CTest 與測試總管整合。 從 CMake 主功能表執行 CTest 測試。

  2. 如果視窗中遺漏任何測試,請在 [方案總管] 中以滑鼠右鍵按一下其節點,然後選擇 [建置][重建] 以建置測試專案。

  3. 在 [測試總管] 中,選擇 [全部執行],或選取您要執行的特定測試。 以滑鼠右鍵按一下測試即可顯示其他選項,包括在啟用中斷點的偵錯模式中執行測試。 在所有測試都執行之後,視窗會顯示通過的測試以及失敗的測試。

    Test Explorer after tests are run

對於失敗的測試,該訊息會顯示可協助診斷原因的詳細資料。 以滑鼠右鍵按一下失敗的測試,以顯示快顯功能表。 選擇 [偵錯] 以逐步偵錯發生失敗的函式。

如需使用 [測試總管] 的詳細資訊,請參閱使用測試總管執行單元測試

如需單元測試的詳細資訊,請參閱單元測試基本概念

使用 CodeLens

Visual Studio 2017 和更新版本 (Professional 與 Enterprise 版)

CodeLens 可讓您快速查看單元測試的狀態,而不需要離開程式碼編輯器。

以下列任何一種方式來為 C++ 單元測試專案初始化 CodeLens:

  • 編輯及建置測試專案或方案。
  • 重建您的專案或方案。
  • [測試總管] 視窗執行測試。

初始化之後,您可以在每個單元測試上方看到測試狀態圖示。

C++ CodeLens Icons

選擇圖示以取得詳細資訊,或者執行單元測試或對單元測試進行偵錯:

C++ CodeLens Run and Debug