Rédaction de tests en C++
L’exemple de code suivant montre un fichier C++ natif qui contient une seule classe de test avec deux méthodes de test.
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 }
La ligne 1inclut le seul fichier d’en-tête requis pour le framework, WexTestClass.h, trouvé dans %\Program Files (x86)\Windows Kits\10\Testing\Development\inc. Ce fichier d’en-tête inclus inclut également le fichier Log.h pour le Logger et le fichier Verify.h pour définir les cas de vérification. Ces fichiers d’en-tête seront discutés plus tard.
La ligne 3 définit une classe de test, SimpleTests. Les classes de test n’ont pas besoin d’hériter d’une classe spéciale. De plus, leur contenu n’a pas besoin d’être public.
La ligne 5 définit cette classe comme une classe de test.
Les lignes 8 et 9 déclarent les deux méthodes de test dans la classe - FirstTest et SecondTest. Elles sont définies des lignes 12 à 20. La macro TEST_METHOD ajoute la déclaration de méthode requise à la classe. Dans ce schéma de balisage, tous les tests doivent avoir le même prototype. Ils doivent retourner void, et ils ne doivent prendre aucun paramètre.
Si vous souhaitez définir les tests en ligne dans la déclaration de classe, vous pouvez le faire tant que vous incluez « WexTestClass.h » tandis que INLINE_TEST_METHOD_MARKUP est défini dans le préprocesseur.
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 };
Les lignes 10 et 15 contiennent maintenant les définitions des méthodes de test.
Remarque : Si vous mettez la déclaration de votre classe de test dans un fichier d’en-tête, il est préférable de n’inclure ce fichier d’en-tête que dans un seul fichier cpp. Inclure une déclaration de classe de test dans plusieurs fichiers CPP entraîne la compilation de données superflues dans la DLL de test.
Rédaction avancée de tests en C++
L’exemple suivant utilise des méthodes de configuration et de nettoyage et déclare des métadonnées avec les déclarations de classe de test et de méthode de test. Cet exemple contient également une seule classe (MetadataAndFixturesTests) avec deux méthodes de test.
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 }
La ligne 4 commence la déclaration des métadonnées globales, un ensemble de propriétés qui s’appliquent à un binaire de test pour lequel cet en-tête compile.
La ligne 5 déclare une propriété avec le nom Feature et la valeur TAEF. Il pourrait y avoir plus d’une seule propriété entre les macros BEGIN... et END.... Des déclarations de propriétés similaires existent aux lignes 20-24 (métadonnées au niveau de la classe), 45-47 (métadonnées au niveau de la méthode), et 52-54 (métadonnées au niveau du test dans un test défini en ligne).
Les lignes 45 - 47 et 60 – 63 démontrent que ces macros de test pour l’ajout de métadonnées déclarent également les méthodes de test. Les lignes 50 à 57 montrent que vous pouvez toujours avoir des métadonnées même si vous voulez déclarer et définir votre test au même endroit.
La ligne 8 déclare une fonction de configuration de module - une fonction qui s’exécute avant la création de toutes les classes de test du module.
La ligne 13 déclare une fonction de nettoyage de module - une fonction qui s’exécute après que tous les tests et les méthodes de nettoyage de classe et les destructeurs sont terminés. Il existe des méthodes de configuration et de nettoyage similaires pour une classe aux lignes 24 à 32. Ces méthodes s’exécutent après le constructeur de la classe et avant le destructeur de la classe respectivement.
Les lignes 34 à 42 déclarent des fonctions similaires pour les méthodes de test. Les méthodes de configuration et de nettoyage de test s’exécutent avant et après chaque test.
Les méthodes de configuration et de nettoyage de TAEF renvoient un booléen et n’acceptent aucun paramètre. La valeur de retour signale au framework s’il peut continuer à exécuter les tests pour une certaine unité de test. Par exemple, si une méthode de configuration de classe échoue et renvoie false, le framework n’exécutera pas les méthodes de test de la classe.