Partager via


Classe pilotée par les données

Assurez-vous que vous êtes familiarisé avec l’exécution de base de TAEF et que vous savez comment créer des tests à l’aide de cette section. Vous pouvez également consulter l’exemple simple de test piloté par les données. Dans cette section, vous allez créer une classe de test pilotée par les données basée sur un test basé sur des tables , mais la même approche s’applique aux tests basés sur WMI ou PICT basés sur les données.

Quand utiliser une classe pilotée par les données ?

Il arrive que plusieurs tests dépendent des mêmes données d’entrée. Lorsque vous testez des API, vous pouvez exécuter plusieurs tests d’API avec les mêmes données afin d’obtenir une vue cohérente du comportement de l’API. Lorsque vous effectuez des tests au niveau du scénario, vous pouvez vous assurer que toutes les étapes de votre scénario sont testées avec les mêmes données. À ce stade, il est utile de spécifier les données de test au niveau de la classe.

Création d’une classe pilotée par les données

Vous spécifiez qu’une classe donnée est pilotée par les données de la même manière que vous spécifiez qu’un test donné est piloté par les données. Vous appliquez les métadonnées DataSource au niveau de la classe. La valeur identifie la source de données particulière qui vous intéresse. L’exemple suivant montre comment spécifier ces propriétés pour les classes pilotées par les données :

Code natif

1     class 2     {
2         BEGIN_TEST_CLASS(DataDrivenClassExample)
3             TEST_CLASS_PROPERTY(L"DataSource", L"Table:DataDrivenClassExample.xml#ClassTable")
4         END_TEST_CLASS()
5
6         TEST_METHOD(Test1);
7       {
8         int size;
9           if (SUCCEEDED(<span class="style2">TestData::TryGetValue(L"size", size)</span>))
10          {
11              VERIFY_ARE_NOT_EQUAL(size, 0);
12              Log::Comment(String().Format(L"Size retrieved was %d", size));
13          }
14  
15          String color;
16          if (SUCCEEDED(<span class="style2">TestData::TryGetValue(L"color", color)</span>))
17          {
18              Log::Comment(L"Color retrieved was " + color);
19          }
20      }
21         TEST_METHOD(Test2);
22      {
23          int size;
24          if (SUCCEEDED(<span class="style2">TestData::TryGetValue(L"size", size)</span>))
25          {
26              VERIFY_ARE_NOT_EQUAL(size, 0);
27              Log::Comment(String().Format(L"Size retrieved was %d", size));
28          }
29  
30          String color;
31          if (SUCCEEDED(<span class="style2">TestData::TryGetValue(L"color", color)</span>))
32          {
33              Log::Comment(L"Color retrieved was " + color);
34          }
35      } 
36    };

Code managé

1     [TestClass]
2     public class CSharpDataDrivenClassExample
3     {
4         [ClassInitialize]
5         [DataSource("Table:CSharpDataDrivenClassExample.xml#ClassTable")]
6         public static void MyClassInitialize(Object testContext)
7         {
8         }
9
10        [TestMethod]
11        public void Test1()
12        {
13            int size = (int)m_testContext.DataRow["Size"];
14            Verify.AreNotEqual(size, 0);
15            Log.Comment("Size is " + size.ToString());
16
18            Log.Comment("Color is " + m_testContext.DataRow["Color"]);
19        }
20
21        [TestMethod]
22        public void Test2()
23        {
24            int size = (int)m_testContext.DataRow["Size"];
25            Verify.AreNotEqual(size, 0);
26            Log.Comment("Size is " + size.ToString());
27
28            Log.Comment("Color is " + m_testContext.DataRow["Color"]);
29        }
30
31        public TestContext TestContext
32        {
33            get { return m_testContext; }
34            set { m_testContext = value; }
35        }
36
37        private TestContext m_testContext;
38    }

Dans ces exemples, la ligne 3 de l’exemple de code natif et la ligne 5 de l’exemple de code managé sont les méthodes recommandées pour spécifier la source de données pour une classe de test pilotée par les données dans TAEF.

Dans l’exemple de code managé ci-dessus, les lignes 13, 18, 24 et 28 montrent comment les données sont mises à la disposition des méthodes de test pour le code managé.

Dans l’exemple de code suivant, les lignes 4, 11, 20 et 27 montrent comment les données sont mises à la disposition des méthodes de test pour le code natif. Notez que vous rendez les données que vous avez définies dans la table de la classe pilotée par les données (lignes) à la disposition des méthodes de test de la classe (Test1 et Test2) exactement de la même manière que pour un test piloté par les données.

Vous construisez le fichier XML DataSource pour une classe pilotée par les données exactement de la même manière que pour un test piloté par les données. Les exemples suivants montrent les fichiers XML pour les classes natives et managées.

Natif

1 <?xml version="1.0"?>
2 <Data>
3   <Table Id="ClassTable">
4     <ParameterTypes>
5       <ParameterType Name="Size">int</ParameterType>
6     </ParameterTypes>
7     <Row>
8       <Parameter Name="Size">4</Parameter>
9       <Parameter Name="Color">White</Parameter>
10    </Row>
11    <Row>
12      <Parameter Name="Size">10</Parameter>
13      <Parameter Name="Color">Black</Parameter>
14    </Row>
15    <Row>
16      <Parameter Name="Size">9</Parameter>
17      <Parameter Name="Color">Orange</Parameter>
18    </Row>
19    <Row>
20      <Parameter Name="Size">9</Parameter>
21      <Parameter Name="Color">Blue</Parameter>
22    </Row>
23  </Table>
24</Data>

Géré

1 <?xml version="1.0"?>
2 <Data>
3   <Table Id="ClassTable">
4     <ParameterTypes>
5       <ParameterType Name="Size">Int32</ParameterType>
6       <ParameterType Name="Color">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">10</Parameter>
14      <Parameter Name="Color">Black</Parameter>
15    </Row>
16    <Row>
17      <Parameter Name="Size">9</Parameter>
18      <Parameter Name="Color">Orange</Parameter>
19    </Row>
20    <Row>
21      <Parameter Name="Size">9</Parameter>
22      <Parameter Name="Color">Blue</Parameter>
23    </Row>
24  </Table>
25</Data>

En arrière-plan OU à quoi s’attendre ?

Par défaut, lorsque vous créez des tests dans TAEF, l’ordre d’exécution au sein d’une classe est identique à l’ordre dans lequel vous avez codé les méthodes de test dans la classe . Par conséquent, dans les exemples précédents, Test1 s’exécute toujours avant Test2. Étant donné que la classe qui contient Test1 et Test2 est une classe pilotée par les données, toutes les méthodes de classe s’exécutent une fois pour chaque ligne de données que vous avez définie dans DataSource. En d’autres termes, Test1 et Test2 s’exécutent pour la ligne #0. Ensuite, ces méthodes s’exécutent dans le même ordre pour la ligne #1 et ainsi de suite jusqu’à ce que TAEF exécute toutes les lignes.

Exécution de tests dans une classe pilotée par les données

Si vous exécutez les exemples de fichiers binaires de test avec l’option de commande /list , l’ordre d’exécution de la section précédente devient clair.

Natif

TE.exe Examples\CPP.AdvancedDataDriven.Examples.dll /name:*class* /list
Test Authoring and Execution Framework v2.9.3k for x86

        F:\ Examples\CPP.AdvancedDataDriven.Examples.dll
            WEX::TestExecution::Examples::DataDrivenClassExample#0
                WEX::TestExecution::Examples::DataDrivenClassExample#0::Test1
                WEX::TestExecution::Examples::DataDrivenClassExample#0::Test2
            WEX::TestExecution::Examples::DataDrivenClassExample#1
                WEX::TestExecution::Examples::DataDrivenClassExample#1::Test1
                WEX::TestExecution::Examples::DataDrivenClassExample#1::Test2
            WEX::TestExecution::Examples::DataDrivenClassExample#2
                WEX::TestExecution::Examples::DataDrivenClassExample#2::Test1
                WEX::TestExecution::Examples::DataDrivenClassExample#2::Test2
            WEX::TestExecution::Examples::DataDrivenClassExample#3
                WEX::TestExecution::Examples::DataDrivenClassExample#3::Test1
                WEX::TestExecution::Examples::DataDrivenClassExample#3::Test2

Géré

TE.exe Examples\CSharp.AdvancedDataDriven.Examples.dll /name:*class* /list
Test Authoring and Execution Framework v2.9.3k for x86

        F:\ Examples\CSharp.AdvancedDataDriven.Examples.dll
            WEX.Examples.CSharpDataDrivenClassExample#0
                WEX.Examples.CSharpDataDrivenClassExample#0.Test1
                WEX.Examples.CSharpDataDrivenClassExample#0.Test2
            WEX.Examples.CSharpDataDrivenClassExample#1
                WEX.Examples.CSharpDataDrivenClassExample#1.Test1
                WEX.Examples.CSharpDataDrivenClassExample#1.Test2
            WEX.Examples.CSharpDataDrivenClassExample#2
                WEX.Examples.CSharpDataDrivenClassExample#2.Test1
                WEX.Examples.CSharpDataDrivenClassExample#2.Test2
            WEX.Examples.CSharpDataDrivenClassExample#3
                WEX.Examples.CSharpDataDrivenClassExample#3.Test1
                WEX.Examples.CSharpDataDrivenClassExample#3.Test2

Notez que les index des exemples ci-dessus sont similaires aux tests pilotés par les données. Chaque ligne de la classe pilotée par les données est identifiée par un index. Tout comme dans les tests pilotés par les données, vous pouvez choisir de donner à n’importe quelle ligne un nom court plus explicite en spécifiant les métadonnées au niveau de la ligne dans le fichier XML et en imprimant ce nom au lieu de l’index lors de la liste ou de l’exécution des tests.

De même, vous utilisez l’option /listproperties pour confirmer que les données sont bien spécifiées et disponibles au niveau de la classe.

Natif

F:\ Examples\CPP.AdvancedDataDriven.Examples.dll
    WEX::TestExecution::Examples::DataDrivenClassExample#0
            Property[DataSource] =  Table:DataDrivenClassExample.xml#ClassTable

            Data[Color] = White
            Data[Size] = 4
        WEX::TestExecution::Examples::DataDrivenClassExample#0::Test1
        WEX::TestExecution::Examples::DataDrivenClassExample#0::Test2

    WEX::TestExecution::Examples::DataDrivenClassExample#1
            Property[DataSource] =  Table:DataDrivenClassExample.xml#ClassTable

            Data[Color] = Black
            Data[Size] = 10
        WEX::TestExecution::Examples::DataDrivenClassExample#1::Test1
        WEX::TestExecution::Examples::DataDrivenClassExample#1::Test2

    WEX::TestExecution::Examples::DataDrivenClassExample#2
            Property[DataSource] =  Table:DataDrivenClassExample.xml#ClassTable

            Data[Color] = Orange
            Data[Size] = 9
        WEX::TestExecution::Examples::DataDrivenClassExample#2::Test1
        WEX::TestExecution::Examples::DataDrivenClassExample#2::Test2

    WEX::TestExecution::Examples::DataDrivenClassExample#3
            Property[DataSource] =  Table:DataDrivenClassExample.xml#ClassTable

            Data[Color] = Blue
            Data[Size] = 9
        WEX::TestExecution::Examples::DataDrivenClassExample#3::Test1
        WEX::TestExecution::Examples::DataDrivenClassExample#3::Test2

Géré

F:\ Examples\CSharp.AdvancedDataDriven.Examples.dll
    WEX.Examples.CSharpDataDrivenClassExample#0
            Setup: MyClassInitialize
            Property[DataSource] =  Table:CSharpDataDrivenClassExample.xml#ClassTable

            Data[Color] = White
            Data[Size] = 4
        WEX.Examples.CSharpDataDrivenClassExample#0.Test1
        WEX.Examples.CSharpDataDrivenClassExample#0.Test2

    WEX.Examples.CSharpDataDrivenClassExample#1
            Setup: MyClassInitialize
            Property[DataSource] =  Table:CSharpDataDrivenClassExample.xml#ClassTable

            Data[Color] = Black
            Data[Size] = 10
        WEX.Examples.CSharpDataDrivenClassExample#1.Test1
        WEX.Examples.CSharpDataDrivenClassExample#1.Test2

    WEX.Examples.CSharpDataDrivenClassExample#2
            Setup: MyClassInitialize
            Property[DataSource] =  Table:CSharpDataDrivenClassExample.xml#ClassTable

            Data[Color] = Orange
            Data[Size] = 9
        WEX.Examples.CSharpDataDrivenClassExample#2.Test1
        WEX.Examples.CSharpDataDrivenClassExample#2.Test2

    WEX.Examples.CSharpDataDrivenClassExample#3
            Setup: MyClassInitialize
            Property[DataSource] =  Table:CSharpDataDrivenClassExample.xml#ClassTable

            Data[Color] = Blue
            Data[Size] = 9
        WEX.Examples.CSharpDataDrivenClassExample#3.Test1
        WEX.Examples.CSharpDataDrivenClassExample#3.Test2

Vous pouvez appliquer toutes les règles d’exécution à la classe pilotée par les données. Vous pouvez baser votre requête de sélection sur tout ce que vous pouvez lister dans l’option /listproperties .

Tests pilotés par les données dans une classe pilotée par les données

Vous n’êtes en aucun cas confiné pour avoir des tests pilotés par les données au sein d’une classe pilotée par les données. Cette approche peut être utile lors de l’écriture de tests d’API. Vous pouvez conserver les données communes pour tous les tests d’une classe au niveau de la classe DataSource. Vous spécifiez les données spécifiques à la méthode de test dans les métadonnées DataSource de la méthode que vous marquez comme pilotée par les données.

REMARQUE : dans ce cas, l’ordre d’exécution est un peu plus impliqué.

Les exemples suivants montrent comment les deux exemples binaires précédents s’affichent avec l’option de commande /list .

Natif

TE.exe Examples\CPP.AdvancedDataDriven.Examples.dll /name:*nested* /list
Test Authoring and Execution Framework v2.9.3k for x86

        F:\ Examples\CPP.AdvancedDataDriven.Examples.dll
            WEX::TestExecution::Examples::NestedDataDrivenExample#0
                WEX::TestExecution::Examples::NestedDataDrivenExample#0::Test1
                WEX::TestExecution::Examples::NestedDataDrivenExample#0::Test2#0
                WEX::TestExecution::Examples::NestedDataDrivenExample#0::Test2#1
                WEX::TestExecution::Examples::NestedDataDrivenExample#0::Test2#2
                WEX::TestExecution::Examples::NestedDataDrivenExample#0::Test2#3
            WEX::TestExecution::Examples::NestedDataDrivenExample#1
                WEX::TestExecution::Examples::NestedDataDrivenExample#1::Test1
                WEX::TestExecution::Examples::NestedDataDrivenExample#1::Test2#0
                WEX::TestExecution::Examples::NestedDataDrivenExample#1::Test2#1
                WEX::TestExecution::Examples::NestedDataDrivenExample#1::Test2#2
                WEX::TestExecution::Examples::NestedDataDrivenExample#1::Test2#3
            WEX::TestExecution::Examples::NestedDataDrivenExample#2
                WEX::TestExecution::Examples::NestedDataDrivenExample#2::Test1
                WEX::TestExecution::Examples::NestedDataDrivenExample#2::Test2#0
                WEX::TestExecution::Examples::NestedDataDrivenExample#2::Test2#1
                WEX::TestExecution::Examples::NestedDataDrivenExample#2::Test2#2
                WEX::TestExecution::Examples::NestedDataDrivenExample#2::Test2#3
            WEX::TestExecution::Examples::NestedDataDrivenExample#3
                WEX::TestExecution::Examples::NestedDataDrivenExample#3::Test1
                WEX::TestExecution::Examples::NestedDataDrivenExample#3::Test2#0
                WEX::TestExecution::Examples::NestedDataDrivenExample#3::Test2#1
                WEX::TestExecution::Examples::NestedDataDrivenExample#3::Test2#2
                WEX::TestExecution::Examples::NestedDataDrivenExample#3::Test2#3

Géré

TE.exe Examples\CSharp.AdvancedDataDriven.Examples.dll /name:*nested* /list
Test Authoring and Execution Framework v2.9.3k for x86

        F:\ Examples\CSharp.AdvancedDataDriven.Examples.dll
            WEX.Examples.CSharpDataDrivenNestedExample#0
                WEX.Examples.CSharpDataDrivenNestedExample#0.Test1
                WEX.Examples.CSharpDataDrivenNestedExample#0.Test2#0
                WEX.Examples.CSharpDataDrivenNestedExample#0.Test2#1
                WEX.Examples.CSharpDataDrivenNestedExample#0.Test2#2
                WEX.Examples.CSharpDataDrivenNestedExample#0.Test2#3
            WEX.Examples.CSharpDataDrivenNestedExample#1
                WEX.Examples.CSharpDataDrivenNestedExample#1.Test1
                WEX.Examples.CSharpDataDrivenNestedExample#1.Test2#0
                WEX.Examples.CSharpDataDrivenNestedExample#1.Test2#1
                WEX.Examples.CSharpDataDrivenNestedExample#1.Test2#2
                WEX.Examples.CSharpDataDrivenNestedExample#1.Test2#3
            WEX.Examples.CSharpDataDrivenNestedExample#2
                WEX.Examples.CSharpDataDrivenNestedExample#2.Test1
                WEX.Examples.CSharpDataDrivenNestedExample#2.Test2#0
                WEX.Examples.CSharpDataDrivenNestedExample#2.Test2#1
                WEX.Examples.CSharpDataDrivenNestedExample#2.Test2#2
                WEX.Examples.CSharpDataDrivenNestedExample#2.Test2#3
            WEX.Examples.CSharpDataDrivenNestedExample#3
                WEX.Examples.CSharpDataDrivenNestedExample#3.Test1
                WEX.Examples.CSharpDataDrivenNestedExample#3.Test2#0
                WEX.Examples.CSharpDataDrivenNestedExample#3.Test2#1
                WEX.Examples.CSharpDataDrivenNestedExample#3.Test2#2
                WEX.Examples.CSharpDataDrivenNestedExample#3.Test2#3

NOTE: La seule restriction dans ce cas est que les tables des deux exemples ne peuvent pas se trouver dans le même fichier DataSource. En d’autres termes, le DataSource de la classe pilotée par les données et la méthode de test pilotée par les données qu’elle contient doivent être différents.

Notez que la méthode Test2 dans nos exemples est un test piloté par les données au sein d’une classe pilotée par les données. Par exemple, dans la ligne WEX. Examples.CSharpDataDrivenNestedExample#3.Test2#0, #3 est l’index de la classe et #0 est l’index pour le test piloté par les données au sein de cette classe. Test2 peut accéder aux deux tables : les données de la ligne de la classe instance à laquelle il appartient et les données de la ligne active pour sa propre table DataSource. En d’autres termes, les données au niveau de la classe et les données au niveau de la méthode de test sont agrégées et disponibles pendant l’exécution de la méthode de test.

Que se passe-t-il en cas de conflit de données si le même nom de données est spécifié au niveau de la classe et au niveau de la méthode ? TAEF traite cette condition de la même manière qu’il traite les propriétés de métadonnées. Les données spécifiées dans une ligne au niveau de la méthode remplacent les données spécifiées dans une ligne au niveau de la classe.

Par exemple, considérez le cas où vous avez un paramètre appelé Size qui est spécifié à la fois au niveau de la classe et au niveau de la méthode de test. Au niveau de la classe, size est défini comme étant de type String Array , mais au niveau de la méthode de test, il est défini comme étant un int. Dans ce cas, le type int remplace le type String Array au niveau de la méthode de test, ainsi que des méthodes Setup et Teardown pour le test. Toutefois, au niveau des méthodes Setup et Teardown au niveau de la classe, Size a le type de données String Array .

Si vous avez des données en conflit dans votre code, TAEF affiche un avertissement lors de l’exécution et répertorie les propriétés, mais les données en conflit n’entraînent aucun échec.