在 Visual Studio 中使用適用於 C++ 的 Microsoft 單元測試架構

適用於 C++ 的 Microsoft 單元測試架構預設隨附於 [使用 C++ 的桌面開發] 工作負載。

在個別專案中撰寫單元測試

一般而言,您會在程式碼專屬的專案中測試程式碼,且該專案與您要測試的程式碼位於相同的方案中。 若要安裝及設定新的測試專案,請參閱撰寫 C/C++ 的單元測試

在相同專案中撰寫單元測試

在某些情況下 (例如在 DLL 中測試非匯出函式時),您可能需要在與要欲測試程式相同的專案中建立測試。 若要在相同專案中撰寫單元測試:

  1. 修改專案屬性,以包含單元測試所需的標頭和程式庫檔案。

    1. 在 [方案總管] 中,於受測專案的捷徑功能表上選擇 [屬性]。 專案的屬性視窗便會開啟。

    2. 在 [屬性頁] 對話方塊中,選取 [組態屬性]>[VC++ 目錄]

    3. 選取下列資料列中的向下箭號,然後選擇 <編輯>。 加入這些路徑:

      Directory 屬性
      Include 目錄 $(VCInstallDir)Auxiliary\VS\UnitTest\include
      程式庫目錄 $(VCInstallDir)Auxiliary\VS\UnitTest\lib
  2. 加入 C++ 單元測試檔案:

    1. 在 [方案總管] 中,以滑鼠右鍵按一下專案節點,然後選擇 [新增]>[新增項目]

    2. 在 [新增項目] 對話方塊中,選取 [C++ 檔案 (.cpp)],並為其指定適當的名稱,然後選擇 [新增]

將測試連結至物件或程式庫檔案

如果受測程式碼不會匯出您要測試的函式,您可以將輸出 .obj.lib 檔案新增至測試專案的相依性。 修改測試專案的屬性,以包含單元測試所需的標頭和程式庫或物件檔案。

  1. 在方案總管中,於測試專案的捷徑功能表上,選擇 [屬性]。 專案的屬性視窗便會開啟。

  2. 選取 [組態屬性]>[連結器]>[輸入] 頁面,然後選取 [其他相依性]

    選擇 [編輯],然後新增 .obj.lib 檔案的名稱。 不要使用完整路徑名稱。

  3. 選取 [組態屬性]>[連結器]>[一般] 頁面,然後選取 [其他程式庫目錄]

    選擇 [編輯],然後新增 .obj.lib 檔案的目錄路徑。 該路徑通常是位於受測專案的組建資料夾內。

  4. 選取 [組態屬性]>[VC++ 目錄] 頁面,然後選取 [包含目錄]

    選擇 [編輯],然後新增受測專案的標頭目錄。

撰寫測試

使用測試類別的任何 .cpp 檔都必須包含 "CppUnitTest.h",並具有 using namespace Microsoft::VisualStudio::CppUnitTestFramework 的 using 陳述式。 系統已為您設定測試專案。 它也包含命名空間定義,以及 TEST_CLASS 和 TEST_METHOD,以協助您開始進行。 您可以修改命名空間名稱,以及類別和方法巨集中以括弧括住的名稱。

測試架構會定義特殊巨集,用於初始化測試模組、類別和方法,以及在測試完成後清除資源。 這些巨集會產生程式碼,以在第一次存取類別或方法之前執行,以及在最後一個測試執行之後執行。 如需詳細資訊,請參閱初始化和清除

使用 Assert 類別中的靜態方法來定義測試條件。 使用 Logger 類別將訊息寫入至 [輸出視窗]。 將屬性新增至測試方法

執行測試

  1. 在 [測試] 功能表上,選擇 [Windows]>[測試總管]

  2. 如果視窗中未顯示您所有的測試,請建置測試專案,方法是在方案總管中,以滑鼠右鍵按一下其節點,然後選擇 [建置] 或 [重建]

  3. 在 [測試總管] 中,選擇 [全部執行],或選取您要執行的特定測試。 以滑鼠右鍵按一下測試即可顯示其他選項,包括在啟用中斷點的偵錯模式中執行測試。

  4. 在 [輸出視窗] 的下拉式清單中,選擇 [測試],以檢視由 Logger 類別寫出的訊息:

    C++ Output Window showing test messages

定義特徵以啟用群組

您可以在測試方法上定義特徵,以便您分類及分組測試總管中的測試。 若要定義特性,請使用 TEST_METHOD_ATTRIBUTE 巨集。 例如,若要定義名為 TEST_MY_TRAIT的特性:

#define TEST_MY_TRAIT(traitValue) TEST_METHOD_ATTRIBUTE(L"MyTrait", traitValue)

若要在單元測試中使用定義的特性:

BEGIN_TEST_METHOD_ATTRIBUTE(Method1)
    TEST_OWNER(L"OwnerName")
    TEST_PRIORITY(1)
    TEST_MY_TRAIT(L"thisTraitValue")
END_TEST_METHOD_ATTRIBUTE()

TEST_METHOD(Method1)
{
    Logger::WriteMessage("In Method1");
    Assert::AreEqual(0, 0);
}

C++ 特性屬性巨集

下列預先定義的特徵位於 CppUnitTest.h 中。 如需詳細資訊,請參閱適用於 C++ 的 Microsoft 單元測試架構 API 參考

Macro 描述
TEST_METHOD_ATTRIBUTE(attributeName, attributeValue) 使用 TEST_METHOD_ATTRIBUTE 巨集定義特性。
TEST_OWNER(ownerAlias) 使用預先定義的擁有者特性,指定測試方法的擁有者。
TEST_PRIORITY(priority) 使用預先定義的優先權特性,將相對優先權指派給測試方法。