使用 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 中找到。该头文件还包括用于日志记录器的 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 且值为 TAEF 的属性。 BEGIN... 和 END... 宏之间可能不止一个属性。 第 20-24 行(类级元数据)、第 45-47 行(方法级元数据)和第 52-54 行(内联定义的测试中的测试级元数据)也有类似的属性声明。
第 45 - 47 行和 60 - 63 行演示了这些用于添加元数据的测试宏,同时也声明了测试方法。 第 50 - 57 行演示了即使要在同一位置声明和定义测试,也可以使用元数据。
第 8 行声明了一个模块设置函数,该函数在创建模块的任何测试类之前执行。
第 13 行声明了一个模块清理函数 - 一个在所有测试和类清理方法及析构函数结束后执行的函数。 第 24 行至第 32 行也有类似的类设置和清理方法。 这些方法分别在类构造函数之后和类析构函数之前运行。
第 34 行至 42 行为测试方法声明了类似的函数。 测试设置和清理方法在每次测试执行前后运行。
TAEF 设置和清理方法返回布尔值,不接受任何参数。 返回值会向框架发出信号,指明是否可以继续运行某个测试单元的测试。 例如,如果类设置方法失败并返回 false,则框架将不会运行类测试方法。