Partager via


Exemple de test piloté par les données de prise en charge des tableaux

Cette section décrit certaines fonctionnalités avancées des tests pilotés par les données par exemple. Si vous couvrez toujours les concepts de base, vous pouvez commencer par un exemple Simple Data Driven.

Exemples référencés :

  • ArraySupportDataDrivenExample

  • CSharpDataDrivenArraySupportExample

Les sections précédentes ont déjà abordé les principes de base de la création et de l’exécution des tests pilotés par les données. La liste suivante décrit la signification des tableaux dans le sens des tests pilotés par les données TAEF :

  • Les tableaux sont de longueur variable, ensemble de types homogènes d’éléments traités comme un paramètre unique.
  • Pour spécifier un type de tableau, vous devez spécifier explicitement le type du paramètre dans le bloc ParameterTypes et ajouter un attribut Array="true ».

Les types de paramètres pris en charge sont répertoriés dans Types de paramètres dans les sources de données de table.

Si un autre type de données est spécifié, le test lève un avertissement et considère qu’il s’agit d’une chaîne. Dans le cas des tableaux, le type de données serait considéré comme de type String[].

L’exemple suivant montre comment spécifier que le paramètre est un tableau d’un des types de base. Il est important de noter qu’il n’existe aucun type par défaut autorisé dans le cas de tableaux : vous devez spécifier explicitement le type et définir l’attribut Array pour que le paramètre soit vrai.

1  <?xml version="1.0"?>
2  <Data>
3    <Table Id="ArraySupportTable">
4      <ParameterTypes>
5        <ParameterType Name="Size" Array="true">int</ParameterType>
6        <ParameterType Name="Color" Array="true">String</ParameterType>
7      </ParameterTypes>
8      <Row>
9        <Parameter Name="Size">4</Parameter>
10       <Parameter Name="Color">White</Parameter>
11     </Row>
12     <Row>
13       <Parameter Name="Size">
14         <Value>4</Value>
15         <Value>6</Value>
16         <Value>8</Value>
17       </Parameter>
18       <Parameter Name="Color">
19         <Value>Red</Value>
20         <Value>Green</Value>
21         <Value>Blue</Value>
22       </Parameter>
23     </Row>
24     <Row>
25       <Parameter Name="Size">
26         <Value>9</Value>
27         <Value>12</Value>
28         <Value>16</Value>
29       </Parameter>
30       <Parameter Name="Color">Orange</Parameter>
31     </Row>
32     <Row>
33       <Parameter Name="Size">9</Parameter>
34       <Parameter Name="Color">
35         <Value>White</Value>
36         <Value>Black</Value>
37       </Parameter>
38     </Row>
39   </Table>
40 </Data>

Examinez les balises valeur et les attributs array dans l’exemple ci-dessus. Tout d’abord, vous devez spécifier explicitement le type pour les paramètres taille et couleur et spécifier que ces paramètres sont des tableaux, en définissant l’attribut tableau sur vrai. Ensuite, vous spécifiez les valeurs dans <Valeur>...</Value> balises. Vous pouvez avoir autant de <balises Value> que vous devez spécifier n’importe quel nombre de valeurs dans le tableau pour un paramètre row donné.

Notez les lignes 9, 10, 30 et 33 dans les exemples XML ci-dessus. Ces entrées sont des éléments de tableau à valeur unique. En d’autres termes, vous pouvez spécifier des éléments de tableau à valeur unique directement dans la balise <Parameter> sans balise de <valeur supplémentaire>. Également, même si le paramètre de la ligne n’a qu’une seule valeur, il est toujours traité comme un tableau d’un élément et ne peut pas être récupéré autrement.

À présent, examinez les API de récupération.

récupération native

Les éléments de tableau peuvent être récupérés dans du code natif à l’aide de la classe de modèle WEX ::TestExecution ::TestDataArray<>. Pour plus d’informations, consultez l’en-tête publié TestData.h. La classe TestDataArray gère la durée de vie des éléments de tableau et fournit des API utiles pour récupérer des valeurs spécifiques dans le tableau :

1  namespace WEX { namespace TestExecution
2  {
3      template <typename T>
4      class TECOMMON_API TestDataArray sealed
5      {
6         ...
7      public:
8          TestDataArray();
9          ~TestDataArray();
10         const size_t GetSize() const;
11         T& operator[](size_t index);
12
13     private:
14        ...
15     };
16 } /* namespace TestExecution */ } /* namespace WEX */

Vous pouvez obtenir la longueur du tableau en appelant GetSize et en obtenant un élément spécifique à l’aide de l’opérateur [].

L’exemple suivant montre comment utiliser ces fonctions dans le code. Considérez le fichier cpp dans l’exemple natif :

1  TestDataArray<int> sizes;
2  if (SUCCEEDED(TestData::TryGetValue(L"size", sizes)))
3  {
4      size_t count = sizes.GetSize();
5      for (size_t i = 0; i < count; ++i)
6      {
7          Log::Comment(String().Format(L"Size[%d] retrieved was %d", i, sizes[i]));
8      }
9  }
10
11 TestDataArray<String> colors;
12 if (SUCCEEDED(TestData::TryGetValue(L"color", colors)))
13 {
14     size_t count = colors.GetSize();
15     for (size_t i = 0; i < count; ++i)
16     {
17         Log::Comment(String().Format(L"Color[%d] retrieved was ", i) + colors[i]);
18     }
19 }

Tout d’abord, vous définissez un TestDataArray local du type de tableau. Dans ce cas, tailles est un tableau d’int de type et couleurs est un tableau de type WEX ::Common ::String. L’API permettant de récupérer un tableau est similaire à celle qui récupère n’importe quelle variable. Vous appelez TestData ::TryGetValue, demandez-lui de récupérer le paramètre tailleet de placer la valeur dans la variable locale tailles.

Notez qu’une tentative de récupération d’un paramètre non spécifié dans un tableau provoque une erreur et échoue au test. De même, une tentative de récupération d’un tableau dans une variable non matricielle, même si le tableau n’a qu’un seul élément, provoque une erreur.

Si un paramètre de tableau n’est pas spécifié dans la ligne XML du tout, une tentative de récupération du paramètre échoue. Par exemple, si une ligne ressemble à ceci :

       <Row>
         <Parameter Name="Color">
           <Value>White</Value>
           <Value>Black</Value>
         </Parameter>
       </Row>

Notez que le paramètre Size, qui est un tableau, n’est pas spécifié dans la ligne. Si vous tentez de récupérer Taille à partir du code, l’appel d’API retourne un code de retour défaillant. Vous pouvez l’utiliser pour définir une valeur de tableau par défaut.

En revanche, vous pouvez spécifier un tableau vide en spécifiant une balise de paramètre vide pour Taille comme suit :

       <Row>
         <Parameter Name="Size"></Parameter>
         <Parameter Name="Color">
           <Value>White</Value>
           <Value>Black</Value>
         </Parameter>
       </Row>

Dans ce cas, une tentative de récupération de taille réussit, mais la taille du tableau est 0.

récupération managée

La récupération managée reste presque la même qu’auparavant. Vous devez uniquement vous assurer de récupérer les valeurs dans une variable locale du type de tableau approprié. Prenons l’exemple managé suivant :

1  Int32[] sizes = m_testContext.DataRow["Size"] as Int32[];
2  foreach (int size in sizes)
3  {
4          Verify.AreNotEqual(size, 0);
5          Console.WriteLine("Size is " + size.ToString());
6  }
7
8  String[] colors = m_testContext.DataRow["Color"] as String[];
9  foreach (String color in colors)
10 {
11         Console.WriteLine("Color is " + color);
12 }

Comme pour la récupération native, si un paramètre de tableau n’est pas spécifié dans la ligne XML du tout, une tentative de récupération du paramètre retourne un objet de type System.DBNull. Par exemple, si une ligne ressemble à ceci :

       <Row>
         <Parameter Name="Color">
           <Value>White</Value>
           <Value>Black</Value>
         </Parameter>
       </Row>

Notez que le paramètre Size, qui est un tableau, n’est pas spécifié dans la ligne. Si vous tentez de récupérer Size à partir du code, l’appel d’API renvoie un objet de type DBNull. Si vous avez des valeurs de ce type dans votre table, vous pouvez les récupérer du contexte dans un objet en premier et prendre les mesures appropriées après avoir comparé le type d’objet à typeof(System.DBNull) ou le type que vous exécutez.

En revanche, vous pouvez spécifier un tableau vide en spécifiant une balise de paramètre vide pour Size comme suit :

       <Row>
         <Parameter Name="Size"></Parameter>
         <Parameter Name="Color">
           <Value>White</Value>
           <Value>Black</Value>
         </Parameter>
       </Row>

Dans ce cas, une tentative de récupération de taille retourne avec succès un tableau vide de type System.Int32[].

exécution

L’exécution de tests pilotés par les données qui prennent en charge les tableaux n’est pas différente de l’exécution d’un autre test piloté par les données. Le seul point clé de différence est que les smatiques des critères de sélection changent dans le cas des paramètres de données de tableau pour signifier « contient » plutôt que « égal ».

Pour voir ce que cela signifie, supposons que vous souhaitez sélectionner tous les tests pilotés par les données dans lesquels le tableau Couleur contient la valeur Blanc. Pour ce faire, exécutez :

TE.exe Examples\CSharp.DataDriven.Example.dll /select:"@Name='*Array* And @Data:Color='White'"
TE.exe Examples\CPP.DataDriven.Example.dll /select:"@Name='*Array* And @Data:Color='White'"

Cette commande exécute les tests pilotés par les données avec index #0 et #3 dans les deux cas ci-dessus.

Vous pouvez créer des requêtes plus complexes, par exemple, sélectionner uniquement le test dans lequel le tableau couleur contient blanc et le tableau couleur contient noir, ce qui ne sélectionnerait que les tests pilotés par les données avec l’index #3. En tant qu’exercice, essayez d’écrire et d’exécuter cette requête vous-même.