C++ でテストを作成する
次のコード例は、2 つのテスト メソッドを持つ 1 つのテスト クラスを含むネイティブ 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 行目 には、 %\Program Files (x86)\Windows Kits\10\Testing\Development\inc にあるフレームワークに必要な 1 つのヘッダー ファイル WexTestClass.h が含まれています。このヘッダー ファイルには、Logger の Log.h ファイルと、検証ケースを定義するための Verify.h ファイルも含まれています。 これらのヘッダー ファイルについては、後で説明します。
3 行目 では、 テスト クラス SimpleTests が定義されています。 テスト クラスは、特別なクラスから継承する必要はありません。 また、コンテンツを公開する必要はありません。
5 行目 では、このクラスをテスト クラスとして定義します。
8 行目と 9 行目 では、クラスの FirstTest と SecondTest の 2 つのテスト メソッドが宣言されています。 これらは 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 行目 には、テスト メソッドの定義が含まれるようになりました。
注: テスト クラス宣言をヘッダー ファイルに配置する場合は、そのヘッダー ファイルのみを 1 つの cpp ファイルに含めるのが最善です。 テスト クラス宣言を複数の CPP ファイルに含めると、無関係なデータがテスト DLL にコンパイルされます。
C++ での高度な作成テスト
次の例では、セットアップ メソッドと クリーンアップ メソッドを使用し、テスト クラスとテスト メソッドの宣言と共にメタデータを宣言します。 この例には、2 つのテスト メソッドを持つ 1 つのクラス (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...マクロの間には、1つ以上のプロパティが存在する可能性があります。 同様のプロパティ宣言は、20 ~ 24 行目 (クラス レベルのメタデータ)、45 ~ 47行目 (メソッド レベルのメタデータ)、52 ~ 54 行目 (テスト定義インラインのテスト レベル メタデータ) に存在します。
45 行目 ~ 47 行目と 60 行目 ~ 63 行目 では、メタデータを追加するためのこれらのテスト マクロもテスト メソッドを宣言しています。 50 行目 ~ 57 行目 では、同じ場所でテストを宣言して定義する場合でも、メタデータを持つことができます。
8 行目 では、モジュールのセットアップ関数 (モジュールのテスト クラスの作成前に実行される関数) が宣言されています。
13 行目 では、モジュール クリーンアップ 関数 (すべてのテストとクラス クリーンアップ メソッドとデストラクターの完了後に実行される関数) が宣言されています。 24 行目 ~ 32 行目のクラスには、同様のセットアップメソッドとクリーンアップ メソッドがあります。 これらのメソッドは、クラス コンストラクターの後、およびクラス デストラクターの前にそれぞれ実行されます。
34 行目 ~ 42 行目 では、 テスト メソッドに対して同様の関数が宣言されています。 テストセットアップメソッドとクリーンアップメソッドは、各テストの実行前と実行後に実行されます。
TAEF セットアップメソッドと クリーンアップ メソッドはブール値を返し、パラメーターを受け取らなくなります。 戻り値は、特定のテスト ユニットのテストを実行し続けることができるかどうかをフレームワークに通知します。 たとえば、クラスセットアップメソッドが失敗し、false を返した場合、フレームワークはクラステストメソッドを実行しません。