Freigeben über


Erstellen von Tests in C++

Das folgende Code-Beispiel zeigt eine native C++ Datei, die eine einzelne Testklasse mit zwei Testmethoden enthält.

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  }

Zeile 1 enthält die einzelne Header-Datei, die für das Framework erforderlich ist, WexTestClass.h, zu finden unter %\Program Files (x86)\Windows Kits\10\Testing\Development\inc. Diese eingebundene Header-Datei enthält auch die Datei Log.h für den Logger und die Datei Verify.h zur Definition der Verifikationsfälle. Diese Header-Dateien werden später besprochen.

Zeile 3 definiert eine Testklasse, SimpleTests. Testklassen müssen nicht von einer speziellen Klasse erben. Auch ihr Inhalt muss nicht öffentlich sein.

Zeile 5 definiert diese Klasse als eine Testklasse.

Zeilen 8 und 9 deklarieren die beiden Testmethoden der Klasse – FirstTest und SecondTest. Sie werden in den Zeilen 12 bis 20 definiert. Das Makro TEST_METHOD fügt der Klasse die erforderliche Methodendeklaration hinzu. In diesem Markup-Schema müssen alle Tests denselben Prototyp haben. Sie müssen void zurückgeben und dürfen keine Parameter annehmen.

Wenn Sie die Tests inline innerhalb der Klassendeklaration definieren möchten, können Sie das tun, solange Sie "WexTestClass.h" einbinden, während INLINE_TEST_METHOD_MARKUP im Präprozessor definiert ist.

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  };

Die Zeilen 10 und 15 enthalten nun die Definitionen der Testmethoden.

Hinweis Wenn Sie Ihre Testklassendeklaration in einer Header-Datei hinterlegen, ist es am besten, wenn Sie diese Header-Datei nur in eine cpp-Datei einbinden. Das Einbinden einer Testklassendeklaration in mehrere CPP-Dateien führt dazu, dass fremde Daten in die Test-DLL kompiliert werden.

Erweitertes Erstellen von Tests in C++

Das folgende Beispiel verwendet Setup- und Cleanup-Methoden und deklariert Metadaten zusammen mit der Deklaration der Testklasse und der Testmethode. Dieses Beispiel enthält auch eine einzelne Klasse (MetadataAndFixturesTests) mit zwei Testmethoden.

 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  }

Zeile 4 beginnt mit der Deklaration der globalen Metadaten, einer Reihe von Eigenschaften, die für eine Test-Binärdatei gelten, für die dieser Header kompiliert.

Zeile 5 deklariert eine Eigenschaft mit dem Namen Funktion und dem Wert TAEF. Zwischen den Makros BEGIN... und END... kann es mehr als eine Eigenschaft geben. Ähnliche Eigenschaftsdeklarationen gibt es in den Zeilen 20-24 (Metadaten auf Klassenebene), 45-47 (Metadaten auf Methodenebene) und 52-54 (Metadaten auf Testebene in einem inline definierten Test).

Zeilen 45 - 47 und 60 - 63 zeigen, dass diese Testmakros zum Hinzufügen von Metadaten auch die Testmethoden deklarieren. Zeilen 50 - 57 zeigen, dass Sie auch dann Metadaten haben können, wenn Sie Ihren Test an der gleichen Stelle deklarieren und definieren möchten.

Zeile 8 deklariert eine Funktion zur Einrichtung des Moduls – eine Funktion, die vor der Erstellung einer der Testklassen des Moduls ausgeführt wird.

Zeile 13 deklariert eine Modulbereinigungsfunktion – eine Funktion, die ausgeführt wird, nachdem alle Test- und Klassenbereinigungsmethoden und Destruktoren abgeschlossen sind. In den Zeilen 24 bis 32 gibt es ähnliche Einrichtungs- und Bereinigungsmethoden für eine Klasse. Diese Methoden werden nach dem Klassenkonstruktor bzw. vor dem Klassendestruktor ausgeführt.

Die Zeilen 34 bis 42 deklarieren ähnliche Funktionen für die Testmethoden. Die Methoden zur Einrichtung und Bereinigung der Tests werden vor und nach der Ausführung der einzelnen Tests ausgeführt.

Die TAEF-Methoden setup und cleanup geben bool zurück und akzeptieren keine Parameter. Der Rückgabewert signalisiert dem Framework, ob es weiterhin Tests für eine bestimmte Einheit ausführen kann. Wenn z. B. eine Methode zur Einrichtung einer Klasse fehlschlägt und false zurückgibt, wird das Framework die Testmethoden der Klasse nicht ausführen.