使用 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 宣告 類別中的兩個測試方法 - FirstTest 和 SecondTest。 它們定義於第 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,架構將不會執行類別測試方法。