次の方法で共有


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 行目 では、クラスの FirstTestSecondTest の 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 を返した場合、フレームワークはクラステストメソッドを実行しません。