使用 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 行声明了类中的两个测试方法 - 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 且值为 TAEF 的属性。 BEGIN... 和 END... 宏之间可能不止一个属性。 第 20-24 行(类级元数据)、第 45-47 行(方法级元数据)和第 52-54 行(内联定义的测试中的测试级元数据)也有类似的属性声明。

第 45 - 47 行和 60 - 63 行演示了这些用于添加元数据的测试宏,同时也声明了测试方法。 第 50 - 57 行演示了即使要在同一位置声明和定义测试,也可以使用元数据。

第 8 行声明了一个模块设置函数,该函数在创建模块的任何测试类之前执行。

第 13 行声明了一个模块清理函数 - 一个在所有测试和类清理方法及析构函数结束后执行的函数。 第 24 行至第 32 行也有类似的类设置和清理方法。 这些方法分别在类构造函数之后和类析构函数之前运行。

第 34 行至 42 行为测试方法声明了类似的函数。 测试设置和清理方法在每次测试执行前后运行。

TAEF 设置和清理方法返回布尔值,不接受任何参数。 返回值会向框架发出信号,指明是否可以继续运行某个测试单元的测试。 例如,如果类设置方法失败并返回 false,则框架将不会运行类测试方法。