共用方式為


使用 C++ 撰寫測試

下列程式代碼範例顯示原生 C++ 檔案,其中包含單一測試類別,其中包含其中兩個測試方法。

1   #include "WexTestClass.h"
2
3   class SimpleTests   {
4      // Declare this class as a TestClass, and supply metadata if necessary.
5      TEST_CLASS(SimpleTests);
6
7      // Declare the tests within this class.
8      TEST_METHOD(FirstTest);
9      TEST_METHOD(SecondTest);
10  };
11
12  void SimpleTests::FirstTest()
13  {
14      VERIFY_ARE_EQUAL(1, 1);
15  }
16
17  void SimpleTests::SecondTest()
18  {
19      VERIFY_IS_TRUE(true);
20  }

第 1 行包含架構 所需的單一頭檔 WexTestClass.h,位於 %\Program Files (x86)\Windows Kits\10\Testing\Development\inc。包含的頭檔也包含 Loger 的 Log.h 檔案,以及 用於定義驗證案例的 Verify.h 檔案。 稍後將討論這些標頭檔。

第 3 行會定義測試類別 SimpleTests。 測試類別不需要繼承自任何特殊類別。 此外,其內容不需要公開。

第 5 行會將這個類別定義為測試類別。

第 8 行和 9 宣告 類別中的兩個測試方法 - FirstTestSecondTest。 它們定義於第 12 到 20 行。 TEST_METHOD宏會將必要的方法宣告新增至 類別。 在此標記配置中,所有測試都必須具有相同的原型。 它們必須傳回 void,而且不得採用任何參數。

如果您想要在類別宣告中內嵌定義測試,只要您在預處理器中定義INLINE_TEST_METHOD_MARKUP時包含 「WexTestClass.h」。,就可以這麼做。

1   #define INLINE_TEST_METHOD_MARKUP
2   #include "WexTestClass.h"
3
4   class InlineTests
5   {
6       TEST_CLASS(InlineTests);
7 
8       TEST_METHOD(FirstTest)
9       {
10          VERIFY_ARE_EQUAL(1, 1);
11      }
12
13      TEST_METHOD(SecondTest)
14      {
15          VERIFY_IS_TRUE(true);
16      }
17  };

第 10 行和 15 行現在包含測試方法的定義。

注意 如果您將測試類別宣告放在頭檔中,最好只將該頭檔包含在一個 cpp 檔案中。 將測試類別宣告納入多個 CPP 檔案會導致將多餘的數據編譯至測試 DLL。

C++ 中的進階撰寫測試

下列範例會使用安裝和清除方法,並宣告元數據以及測試類別和測試方法宣告。 此範例也包含具有兩個測試方法的單一類別 (MetadataAndFixturesTests)。

 1  #define INLINE_TEST_METHOD_MARKUP
 2  #include "WexTestClass.h"
 3
 4  BEGIN_MODULE()
 5      MODULE_PROPERTY(L"Feature", L"TAEF")
 6  END_MODULE()
 7
 8  MODULE_SETUP(ModuleSetup)
 9  {
10      return true;
11  }
12
13  MODULE_CLEANUP(ModuleCleanup)
14  {
15      return true;
16  }
17
18  class MetadataAndFixturesTests
19  {
20      BEGIN_TEST_CLASS(MetadataAndFixturesTests)
21          TEST_CLASS_PROPERTY(L"Component", L"Verify")
22      END_TEST_CLASS()
23
24      TEST_CLASS_SETUP(ClassSetup)
25      {
26          return true;
27      }
28
29      TEST_CLASS_CLEANUP(ClassCleanup)
30      {
31          return true;
32      }
33
34      TEST_METHOD_SETUP(TestSetup)
35      {
36          return true;
37      }
38
39      TEST_METHOD_CLEANUP(TestCleanup)
40      {
41          return true;
42      }
43
44      // If you use this syntax, you will have to define the test outside of the test class.
45      BEGIN_TEST_METHOD(FirstTest)
46          TEST_METHOD_PROPERTY(L"Owner", L"Contoso")
47      END_TEST_METHOD()
48
49      // You can still have metadata even if you define your test inside the test class.
50      TEST_METHOD(SecondTest)
51      {
52          BEGIN_TEST_METHOD_PROPERTIES()
53              TEST_METHOD_PROPERTY(L"Owner", L"Contoso")
54          END_TEST_METHOD_PROPERTIES()
55
56          VERIFY_IS_TRUE(true);
57      }
58  };
59
60  void MetadataAndFixturesTests::FirstTest()
61  {
62      VERIFY_ARE_EQUAL(1, 1);
63  }

第 4 行會開始宣告全域元數據,這是套用至此標頭編譯之測試二進位檔的一組屬性。

第 5 行會宣告名稱 為 Feature 和 value TAEF 的屬性。 BEGIN 之間可能有多個單一屬性...和 END...宏。 類似的屬性宣告存在於第 20-24 行(類別層級元數據)、45-47(方法層級元數據),以及 52-54(內嵌定義的測試中的測試層級元數據)。

第 45 行 - 47 和 60 – 63 示範這些測試宏,以新增元數據也會宣告測試方法。 第 50 - 57 行示範您仍然可以有元數據,即使您想要在相同的位置宣告和定義測試也一樣。

第 8 行會宣告模組安裝函式 - 在建立任何模組測試類別之前執行的函式。

第 13 行會宣告模組清除函式 - 在所有測試和類別清除方法和解構函式完成後執行的函式。 第 24 行至 32 行的類別有類似的設定和清除方法。 這些方法分別在類別建構函式和類別解構函式之前執行。

第 34 到 42 行會宣告測試方法的類似函式。 測試安裝和清除方法會在每次測試執行之前和之後執行。

TAEF 設定和清除方法會傳回 bool,且不接受任何參數。 傳回值會向架構發出訊號,指出它是否可以繼續執行特定測試單元的測試。 例如,如果類別安裝方法失敗並傳回 false,架構將不會執行類別測試方法。