Partager via


Création de tests en C++

L’exemple de code suivant montre un fichier C++ natif qui contient une classe de test unique avec deux méthodes de test dessus.

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 1 inclut le fichier d’en-tête unique requis pour l’infrastructure, WexTestClass.h, trouvé à %\Program Files (x86)\Windows Kits\10\Testing\Development\inc. Ce fichier d’en-tête inclus inclut également le fichier Log.h pour l’enregistreur d’événements et le fichier Verify.h pour définir les cas de vérification. Ces fichiers d’en-tête seront abordés ultérieurement.

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. En outre, leur contenu n’a pas besoin d’être public.

La ligne 5 définit cette classe comme 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 sur les lignes 12 à 20. La macro TEST_METHOD ajoute la déclaration de méthode requise à la classe. Dans ce schéma de marquage, tous les tests doivent avoir le même prototype. Ils doivent retourner void, et ils ne doivent pas prendre de paramètre.

Si vous souhaitez définir les tests inline 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 désormais les définitions des méthodes de test.

Note Si vous placez votre déclaration de classe de test dans un fichier d’en-tête, il est préférable d’inclure uniquement ce fichier d’en-tête dans un seul fichier cpp. L’inclusion d’une déclaration de classe de test dans plusieurs fichiers CPP entraîne la compilation de données superflues dans la DLL de test.

Tests de création avancés en C++

L’exemple suivant utilise les méthodes d’installation et de nettoyage et déclare les métadonnées, ainsi que les déclarations de classe de test et de méthode de test. Cet exemple contient également une classe unique (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 de métadonnées globales, un ensemble de propriétés qui s’appliquent à un fichier binaire de test pour lequel cet en-tête est compilé.

La ligne 5 déclare une propriété portant le nom Feature et la valeur TAEF. Il peut y avoir plus d’une propriété unique entre BEGIN... et END... Macros. Les déclarations de propriétés similaires existent sur les 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 de niveau test dans un test défini inline).

Les lignes 45 - 47 et 60 – 63 illustrent 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 souhaitez déclarer et définir votre test dans le même emplacement.

La ligne 8 déclare une fonction de configuration de module : fonction qui s’exécute avant la création de l’une des classes de test du module.

La ligne 13 déclare une fonction de nettoyage de module : une fonction qui s’exécute après l’achèvement de tous les tests, des méthodes de nettoyage de classe et des destructeurs. Il existe des méthodes de configuration et de nettoyage similaires pour une classe sur les lignes 24 à 32. Ces méthodes s’exécutent après le constructeur de classe et avant le destructeur de 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 d’installation et de nettoyage TAEF retournent bool et n’acceptent aucun paramètre. La valeur de retour indique au cadre s'il peut continuer à exécuter des tests pour une unité de test donnée. Par exemple, si une méthode d’installation de classe échoue et retourne false, l’infrastructure n’exécute pas les méthodes de test de classe.