在 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有數個非 Microsoft 適配器可用。 如需詳細資訊,請參閱 安裝單元測試架構。
Visual Studio 2017 及更新版本 (Professional and Enterprise)
C++ 單元測試專案支援 CodeLens。
Visual Studio 2017 及更新版本 (所有版本)
Google Test 配接器隨附作為 [使用 C++ 的桌面開發] 工作負載的預設元件。 它有一個專案範本,您可以將其新增到解決方案中。 以滑鼠右鍵按一下 [方案總管] 中的方案節點,然後選擇快捷方式功能表上的 [新增>新增專案] 以新增專案範本。 它也具有您可以使用 Tools>Options來設定的選項。 如需詳細資訊,請參閱如何:在 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 的測試配接器」中找到它們。
提示
您也可以使用 Copilot /tests
Slash 命令,從程式碼產生單元測試。 例如,您可以輸入 /tests using Boost framework
以產生 Boost.Test 測試。 如需詳細資訊,請參閱在 Copilot Chat 使用 Slash 命令。
基本測試工作流程
下列各節說明協助您開始使用 C++ 單元測試的基本步驟。 Microsoft 和 Google Test 架構的基本組態類似。 Boost.Test 需要您手動建立測試專案。
在 Visual Studio 2022 中建立測試專案
在一或多個測試專案內定義並執行單元測試。 測試專案會建立一個單獨的應用程式,以呼叫可執行檔中的程式碼並報告其行為。 在與您要測試的程式碼相同的解決方案中建立測試專案。
若要將新的測試專案新增至現有的方案:
- 以滑鼠右鍵按一下 [方案總管] 中的 [方案] 節點。
- 在內容選單中,選擇 新增>新專案。
- 將 Language 設定為 C++,並在搜尋方塊中輸入 測試。 下列螢幕擷取畫面顯示當安裝 C++ 和 UWP 開發 工作負載時可用的測試專案:
在 Visual Studio 2019 中建立測試專案
在一或多個測試專案內定義並執行測試。 在與您要測試的程式碼相同的解決方案中建立專案。
若要將新的測試專案新增至現有的方案:
- 以滑鼠右鍵按一下 [方案總管] 中的 [方案] 節點。
- 在內容選單中,選擇 新增>新專案。
- 將 Language 設定為 C++,並在搜尋方塊中輸入 測試。 下列螢幕快照顯示安裝 C++ 桌面開發 和 UWP 開發 工作負載後可用的測試專案:
在方案中建立其他專案的參考
若要啟用對受測專案中函式的存取,請在測試專案中新增對該專案的參考。 在 [方案總管]中,展開您的測試專案。 以滑鼠右鍵按兩下 [參考],然後選取 [[新增>參考]。 在 [[新增參考] 對話框中,選擇您要測試的專案。
連結至物件或程式庫檔案
如果測試程式代碼未匯出您想要測試的函式,請將輸出 .obj
或 .lib
檔案新增至測試專案的相依性。 如需詳細資訊,請參閱若要將測試連結至物件或程式庫檔案。 請勿包含具有 main
函式或其他標準進入點 (例如 wmain
、WinMain
或 DllMain
) 的物件檔案。 當您將新的來源檔案新增至專案時,請更新測試專案相依性以包含對應的物件檔。
針對標頭檔新增 #include 指示詞
在單元測試 .cpp
檔案中,為宣告您要測試的類型和函式的任何標頭檔案新增 #include
指令。 輸入 #include "
,然後 IntelliSense 會啟動來協助您做選擇。 針對任何更多的標頭重複此動作。
提示
若要避免在來源檔案中的每個 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 巨集,因此可從 [測試總管] 視窗探索方法。
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
類別包含許多其他方法可用來將預期結果與實際結果進行比較。
您可以將「特徵」新增至測試方法中以指定測試擁有者、優先順序和其他資訊。 接著可以使用這些值來排序及分組測試總管中的測試。 如需詳細資訊,請參閱使用測試總管執行單元測試。
執行測試
在【測試】功能表上,選擇【測試總管】。 下圖顯示執行測試之前的測試專案。
注意
目前無法將 CTest 與測試總管整合。 從 CMake 主功能表執行 CTest 測試。
如果視窗中遺漏任何測試,請在 [方案總管] 中以滑鼠右鍵按一下其節點,然後選擇 [建置] 或 [重建] 以建置測試專案。
在 [測試總管] 中,選擇 [全部執行],或選取您要執行的特定測試。 以滑鼠右鍵按一下測試即可顯示其他選項,包括在啟用中斷點的偵錯模式中執行測試。 在所有測試都執行之後,視窗會顯示通過的測試以及失敗的測試。
對於失敗的測試,該訊息會顯示可協助診斷原因的詳細資料。 以滑鼠右鍵按一下失敗的測試,以顯示快顯功能表。 選擇 [偵錯] 以逐步偵錯發生失敗的函式。
如需使用 [測試總管] 的詳細資訊,請參閱使用測試總管執行單元測試。
如需單元測試的詳細資訊,請參閱單元測試基本概念。
使用 CodeLens
Visual Studio 2017 和更新版本 (Professional 與 Enterprise 版)
CodeLens 可讓您快速查看單元測試的狀態,而不需要離開程式碼編輯器。
以下列任何一種方式來為 C++ 單元測試專案初始化 CodeLens:
- 編輯及建置測試專案或方案。
- 重建您的專案或方案。
- 從 [測試總管] 視窗執行測試。
初始化 CodeLens 之後,您可以看到每個單元測試上方的測試狀態圖示。
選擇圖示以取得詳細資訊,或者執行單元測試或對單元測試進行偵錯: