Partager via


Exemple de test basé sur les données de prise en charge de tableaux

Cette section décrit certaines fonctionnalités avancées des tests basés sur les données à titre d’exemple. Si vous abordez encore les principes de base, vous pouvez commencer par un Exemple basé sur des données simples.

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 basés sur les données. La liste suivante explique la signification des tableaux au sens de tests TAEF basés sur les données :

  • Les tableaux sont des ensembles d’éléments de longueur variable et de type homogène qui sont traités comme un seul paramètre.
  • 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 émet 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 true.

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 Value et les attributs Array dans l’exemple ci-dessus. Tout d’abord, vous devez spécifier explicitement le type pour les paramètres Size et Color, et spécifier que qu’ils sont des tableaux, en définissant l’attribut Array sur true. Ensuite, vous spécifiez les valeurs dans les balises <Value>...</Value>. Vous pouvez avoir autant de balises <Value> que nécessaire pour spécifier un nombre quelconque de valeurs dans le tableau pour un paramètre Row donné.

Observez 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 du tableau à valeur unique directement dans la balise <Parameter> sans balise <Value> supplémentaire. En outre, même si le paramètre de la ligne n’a qu’une seule valeur, il est toujours traité comme un tableau à un élément et ne peut pas être récupéré dans le cas contraire.

À 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 en savoir plus, 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, définissez un TestDataArray local du type de tableau. Dans ce cas, sizes est un tableau de type int et colors 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. Appelez TestData::TryGetValue, demandez-lui de récupérer le paramètre size et placez la valeur dans la variable locale sizes.

Il convient de noter qu’une tentative de récupération dans un tableau d’un paramètre spécifié qui n’est pas un tableau provoque une erreur et fait échouer le test. De même, une tentative de récupération d’un tableau dans une variable qui n’est pas un tableau, même si le tableau n’a qu’un seul élément, provoque une erreur.

Si un paramètre de tableau n’est pas du tout spécifié dans la ligne XML, la 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>

Il convient de noter que le paramètres size, qui est un tableau, n’est pas spécifiée dans la ligne. Si vous tentez de récupérer Size à partir du code, l’appel d’API renvoi 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 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 size réussit, mais la taille du tableau est 0.

Récupération gérée

La récupération gérée demeure quasiment identique à l’antérieure. Vous devez uniquement vous assurer de récupérer les valeurs dans une variable locale du type de tableau approprié. Considérez l’exemple géré 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 du tout spécifié dans la ligne XML, une tentative de récupération du paramètre renvoie 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>

Il convient de noter que le paramètres size, qui est un tableau, n’est pas spécifiée 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 de telles valeurs dans votre table, vous pouvez les récupérer du contexte d’abord dans un objet et prendre les mesures appropriées après avoir comparé le type d’objet à typeof(System.DBNull) ou au type que vous attendez.

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 size renvoie avec succès un tableau vide de type System.Int32[].

Exécution

L’exécution de tests basés sur les données qui prennent en charge les tableaux n’est pas différente de l’exécution d’autres tests basés les données. Le seul point clé différent réside dans le fait que la sémantique 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 comprendre ce que cela signifie, supposons que vous souhaitez sélectionner tous les tests basés sur les données où le tableau color contient la valeur White. 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 basés sur les données avec index #0 et #3 dans les deux cas ci-dessus.

Vous pouvez créer des demandes plus complexes, par exemple, sélectionner uniquement le test dans lequel le tableau color contient white et le tableau color contient black, ce qui ne sélectionnerait que les tests basés sur les données avec l’index #3. En tant qu’exercice, essayez d’écrire et d’exécuter cette demande vous-même.