Condividi tramite


Creazione di test in C++

L'esempio di codice seguente mostra un file C++ nativo che contiene una singola classe di test con due metodi di test su di esso.

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 riga 1 include il singolo file di intestazione necessario per il framework, WexTestClass.h, disponibile in %\Programmi (x86)\Windows Kits\10\Testing\Development\inc. Il file di intestazione incluso include anche il file Log.h per logger e il file Verify.h per definire i case di verifica. Questi file di intestazione verranno descritti più avanti.

La riga 3 definisce una classe di test, SimpleTests. Le classi di test non devono ereditare da alcuna classe speciale. Inoltre, il loro contenuto non deve essere pubblico.

La riga 5 definisce questa classe come classe di test.

Le righe 8 e 9 dichiarano i due metodi di test nella classe FirstTest e SecondTest. Sono definiti sulle righe da 12 a 20. La macro TEST_METHOD aggiunge la dichiarazione del metodo richiesta alla classe . In questo schema di mark-up, tutti i test devono avere lo stesso prototipo. Devono restituire void e non devono accettare parametri.

Se si desidera definire i test inline all'interno della dichiarazione di classe, è possibile farlo purché si includa "WexTestClass.h" mentre INLINE_TEST_METHOD_MARKUP è definito nel preprocessore.

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

Le righe 10 e 15 contengono ora le definizioni dei metodi di test.

Nota Se si inserisce la dichiarazione della classe di test in un file di intestazione, è consigliabile includere solo il file di intestazione in un file cpp. L'inclusione di una dichiarazione di classe di test in più file CPP comporta la compilazione di dati estranei nella DLL di test.

Test avanzati di creazione in C++

L'esempio seguente usa metodi di installazione e pulizia e dichiara i metadati insieme alle dichiarazioni della classe di test e del metodo di test. Questo esempio contiene anche una singola classe (MetadataAndFixturesTests) con due metodi di 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 riga 4 inizia la dichiarazione di metadati globali, un set di proprietà che si applicano a un file binario di test per il quale questa intestazione viene compilata.

La riga 5 dichiara una proprietà con il nome Feature e il valore TAEF. Ci potrebbe essere più di una singola proprietà tra BEGIN... e FINE... Macro. Le dichiarazioni di proprietà simili esistono nelle righe 20-24 (metadati a livello di classe), 45-47 (metadati a livello di metodo) e 52-54 (metadati a livello di test in un test definito inline).

Le righe 45 - 47 e 60 - 63 illustrano queste macro di test per l'aggiunta di metadati dichiarano anche i metodi di test. Le righe 50 - 57 mostrano che è comunque possibile avere metadati anche se si desidera dichiarare e definire il test nella stessa posizione.

La riga 8 dichiara una funzione di installazione del modulo: una funzione eseguita prima della creazione di una delle classi di test del modulo.

La riga 13 dichiara una funzione di pulizia del modulo: una funzione che viene eseguita dopo il completamento di tutti i metodi di pulizia e i metodi di pulizia della classe. Esistono metodi di installazione e pulizia simili per una classe sulle righe 24, anche se 32. Questi metodi vengono eseguiti rispettivamente dopo il costruttore della classe e prima del distruttore della classe.

Le righe da 34 a 42 dichiarano funzioni simili per i metodi di test. I metodi di installazione e pulizia dei test vengono eseguiti prima e dopo l'esecuzione di ogni test.

I metodi di installazione e pulizia TAEF restituiscono bool e non accettano parametri. Il valore restituito segnala al framework se può continuare a eseguire test per una determinata unità di test. Ad esempio, se un metodo di installazione della classe ha esito negativo e restituisce false, il framework non eseguirà i metodi di test della classe.