Freigeben über


Einfaches Datengesteuertes Testbeispiel

In diesem Abschnitt werden mehrere Beispiele für datengesteuerte Tests beschrieben und spezifische Features in den einzelnen Beispielen behandelt.

Im ersten Beispiel handelt es sich um einen einfachen datengesteuerten Test namens SimpleDataDrivenExample.

Im verwalteten Beispiel finden Sie eine XML-Datei, die wie folgt aussieht:

    1  <?xml version="1.0"?>
    2  <Data>
    3    <Table Id="Table1">
    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>

Diese XML-Datei definiert die Datenparameter für den zu verwendenden datengesteuerten Test. Der oberste XML-Knoten ist das <Data-Tag> , das mindestens ein <darin definiertes Table-Tags> enthalten kann. Jede Tabelle muss einem eindeutigen Attribut "ID" zugeordnet werden. Die Testfunktionen verwenden den Tabellen-ID-Wert, um die bestimmte Tabelle zu identifizieren, die sie in der XML-Datei verwenden.

Innerhalb des <Table-Tag> verfügen Sie über einen optionalen <ParameterTypes>-Abschnitt. Hier können Sie den Datentyp für einen bestimmten Parameter explizit mithilfe von <ParameterTypes-Tags> angeben. Im obigen Beispiel geben Sie explizit an, dass der Parameter "Size" vom Typ "Int32" und "Parameter "Color" eine Zeichenfolge ist. Zusammenfassung: Der ParameterTypes-Abschnitt ist optional. Wenn keine Parametertypinformationen angegeben werden, werden sie standardmäßig als Zeichenfolge gespeichert.

Wenn Sie die Beispiele "Managed" und "Native" vergleichen, werden Sie feststellen, dass der einzige Unterschied zwischen den beiden Beispielen im <ParameterTypes-Block> liegt. Die native XML-Datei gibt die Größe als nativen ganzzahligen Typ "int" an und verwendet den Standardtyp WEX::Common::String für die Farbe, indem der Typ nicht explizit angegeben wird. Aus Gründen der Einfachheit zeigt das folgende Beispiel die XML-Datei aus dem systemeigenen Beispiel.

    1  <?xml version="1.0"?>
    2  <Data>
    3    <Table Id="SimpleTable">
    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>

Die parametertypen, die in nativem und verwaltetem Code unterstützt werden, werden in Parametertypen in Tabellendatenquellen aufgeführt.

Wenn ein anderer Datentyp angegeben ist, löst der Test eine Warnung aus und berücksichtigt, dass er eine Zeichenfolge ist.

Wenn Sie mit den XML-Dateien fortfahren, verfügen Sie nach dem <ParameterTypes-Block> in beiden XML-Dateien über identische Zeilensätze<>, die jeweils einer Gruppe von Daten in unseren verwalteten und nativen Beispielen entsprechen. In diesem speziellen Fall verfügen Sie über 4 Datensätze, die mithilfe von vier <Zeilenblöcken> definiert werden, wobei jeweils die Werte der Parameter mithilfe <der Parametertags> angegeben werden.

Dies deckt die wesentlichen Grundlagen der verschiedenen Teile der Datenquellendatei ab. Sehen wir uns nun an, wie Sie die Werte abrufen können, die Sie in der obigen XML-Datei angegeben haben.

Einrichtung des Tests als datengesteuerter Test

Nachdem die Daten spezifiziert sind, benötigen Sie eine Möglichkeit, den Code oder die Testmethode, die die Daten verwenden wird, mit diesen in der XML-Datei zu verknüpfen. Dazu geben Sie in den verwalteten und nativen Beispielen die Metadaten "DataSource" an. Die DataSource-Metadaten enthalten drei Teile:

  1. 'Table:' – Dies identifiziert die Datenquelle als XML-Tabelle.
  2. 'DataDrivenTests.xml' – dies ist die Datei, die die XML-Tabelle enthält.
  3. '#Table2' – Nach dem Delimeter '#' identifiziert der Wert 'Table2' die bestimmte Tabelle im zu verwendenden XML-Dokument. Eine einzelne XML-Tabellendatenquelle kann mehrere Tabellen enthalten. TAEF durchsieht die XML-Datei für ein Table-Element mit einem Attribut "ID", das dem angegebenen Wert entspricht.

Sehen Sie sich den Code, der die oben genannten Aspekte abdeckt, noch einmal kurz an.

Nativer Code

1   class SimpleDataDrivenExample
2   {
3      BEGIN_TEST_CLASS(SimpleDataDrivenExample)
4        TEST_CLASS_PROPERTY(L"Description", L"Simple example in table-based data-driven tests")
5      END_TEST_CLASS()
6   
7      TEST_METHOD_CLEANUP(TestCleanup);
8      TEST_METHOD_SETUP(TestSetup);
9    
10     BEGIN_TEST_METHOD(DataDrivenTest)
11       TEST_METHOD_PROPERTY(L"DataSource", L"Table:SimpleDataDrivenExample.xml#SimpleTable")
11     END_TEST_METHOD()
12     ...

Verwalteter Code

    1 [TestMethod]
    2 [DataSource("Table:CSharpDataDrivenSimpleExample.xml#SimpleTable")]
    3 public void DataDrivenTest()
    4 {
    5  ...
    6 }

"DataSource" ist eine bekannte Eigenschaft in Microsoft.VisualStudio.TestTools.UnitTesting.

Zusätzlich zu den oben genannten Schritten benötigen Sie einige zusätzliche Schritte für datengesteuerte Tests in verwaltetem Code. Außerdem müssen Sie eine private TestContext-Eigenschaft definieren. Weitere Informationen finden Sie unter TestContext Class. Sie definieren auch öffentliche Prüfer für diese Eigenschaft. Intern legt TAEF diese TestContext-Eigenschaft fest, damit Sie darauf zugreifen können. Sehen Sie sich diesen Codeabschnitt schnell an:

    1 public TestContext TestContext
    2 {
    3     get;
    4     set;
    5 }

Abrufen von Daten in der Test-Methode

Die Abruf-APIs unterscheiden sich in verwaltetem und systemeigenem Code. Beginnen wir mit dem Verständnis der systemeigenen Abruf-API:

    1  void SimpleDataDrivenExample::DataDrivenTest()
    2  {
    3          int size;
    4          if (SUCCEEDED(TestData::TryGetValue(L"size", size)))
    5          {
    6              VERIFY_ARE_NOT_EQUAL(size, 0);
    7              Log::Comment(String().Format(L"Size retrieved was %d", size));
    8          }
    9
    10         String color;
    11         if (SUCCEEDED(TestData::TryGetValue(L"color", color)))
    12         {
    13             Log::Comment(L"Size retrieved was " + color);
    14         }
    15
    16         unsigned int index;
    17         if (SUCCEEDED(TestData::TryGetValue(L"index", index)))
    18         {
    19             Log::Comment(String().Format(L"At index %d", index));
    20         }
    21 }

Achten Sie besonders auf die Zeilen 4, 11 und 17. Definieren Sie vor jeder dieser Zeilen eine lokale Variable, um die abzurufenden Daten zu speichern. Es ist wichtig, den Typ hier korrekt zu bestimmen. Da Sie "Size" als "int"-Typ in der XML-Datei definiert haben, müssen Sie eine lokale Variable vom Typ "int" definieren, an die sie abgerufen werden soll. Die Abruf-API verwendet den Namen des Parameters, um als Zeichenfolgenwert als ersten Parameter abzurufen. Der zweite Parameter ist die lokale Variable, die per Verweis übergeben und vom TAEF-Code festgelegt wird.

Diese Abruf-API wird in TestData.h definiert und vom WexTestClass.h-Header enthalten, den alle TAEF-Tests enthalten.

Um die Daten in verwaltetem Code abzurufen, verwenden Sie die von Ihnen definierte TestContext-Eigenschaft. Sehen Sie sich den folgenden Code an (oder im Beispiel):

    1  public void DataDrivenTest()
    2  {
    3     int size = (int)m_testContext.DataRow["Size"];
    4     Verify.AreNotEqual(size, 0);
    5     Log.Comment("Size is " + size.ToString());
    6
    7     Log.Comment("Color is " + m_testContext.DataRow["Color"]);
    8     UInt32 index = (UInt32)m_testContext.DataRow["Index"];
    9     Log.Comment("At index " + index.ToString());
    10 }

Wenn Sie mit VSTS vertraut sind, werden Sie feststellen, dass das obige Beispiel ähnlich ist. Verwenden Sie DataRow, und geben Sie den Spaltennamen als Namen des Parameters an, den Sie abrufen möchten.

Wenn Sie im Beispiel sehen, gibt es auch einen nicht datengesteuerten Test in derselben Klasse. Mit anderen Worten, Sie haben die Flexibilität, DataDriven- und NonDataDriven-Tests in derselben Testklasse zu kombinieren.

Ausführen von SimpleDataDrivenExample mit TAEF

Stellen Sie sicher, dass Sie wissen, wie Sie datengesteuerte Tests erstellen und wie Sie Tests mit TAEF ausführen , bevor Sie mit Tipps und Tricks zum Ausführen von DataDrivenTests mit TAEF beginnen. Es kann hilfreich sein, Ihr Gedächtnis aufzufrischen, wie Selection mit TAEF funktioniert.

Die Eingabeaufforderung zum Ausführen von datengesteuerten Tests unterscheidet sich nicht von der Ausführung eines generischen Tests mit TAEF. Um beide Beispiele (systemeigene und verwaltete) auszuführen, die oben beschrieben werden, führen Sie einfach den folgenden Befehl aus:

TE.exe Beispiele\CPP.DataDriven.Example.dll Examples\CSharp.DataDriven.Example.dll /name:*Simple*

Das Argument "/name" fügt basierend auf dem Namen ein Auswahlkriterium hinzu und wählt nur die Klassen aus, an denen Sie interessiert sind. Um auszuwählen, welche Tests innerhalb der Klassen ausgeführt werden sollen, sollten Sie zuerst alle Eigenschaften der DLL auflisten. Anschließend können Sie entscheiden, welche Eigenschaften für Auswahlkriterien verwendet werden sollen.

TE.exe Examples\CPP.DataDriven.Example.dll Examples\CSharp.DataDriven.Example.dll /name:*Simple* /listproperties
f:\Examples\CPP.DataDriven.Example.dll
        WEX::TestExecution::Examples::SimpleDataDrivenExample
                Property[Description] = Simple example in table-based data-driven tests

            WEX::TestExecution::Examples::SimpleDataDrivenExample::DataDrivenTest#0
                    Setup: TestSetup
                    Teardown: TestCleanup
                    Property[DataSource] = Table:SimpleDataDrivenExample.xml#SimpleTable

                    Data[Color] = White
                    Data[Size] = 4

            WEX::TestExecution::Examples::SimpleDataDrivenExample::DataDrivenTest#1
                    Setup: TestSetup
                    Teardown: TestCleanup
                    Property[DataSource] = Table:SimpleDataDrivenExample.xml#SimpleTable

                    Data[Color] = Black
                    Data[Size] = 10

            WEX::TestExecution::Examples::SimpleDataDrivenExample::DataDrivenTest#2
                    Setup: TestSetup
                    Teardown: TestCleanup
                    Property[DataSource] = Table:SimpleDataDrivenExample.xml#SimpleTable

                    Data[Color] = Orange
                    Data[Size] = 9

            WEX::TestExecution::Examples::SimpleDataDrivenExample::DataDrivenTest#3
                    Setup: TestSetup
                    Teardown: TestCleanup
                    Property[DataSource] = Table:SimpleDataDrivenExample.xml#SimpleTable

                    Data[Color] = Blue
                    Data[Size] = 9

            WEX::TestExecution::Examples::SimpleDataDrivenExample::FirstNonDataDrivenTest
                    Setup: TestSetup
                    Teardown: TestCleanup

            WEX::TestExecution::Examples::SimpleDataDrivenExample::SetsOfDataTest#metadataSet0
                    Setup: TestSetup
                    Teardown: TestCleanup
                    Property[Data:Color] = {Purple, Maroon, Brown}

                    Data[Color] = Purple

            WEX::TestExecution::Examples::SimpleDataDrivenExample::SetsOfDataTest#metadataSet1
                    Setup: TestSetup
                    Teardown: TestCleanup
                    Property[Data:Color] = {Purple, Maroon, Brown}

                    Data[Color] = Maroon

            WEX::TestExecution::Examples::SimpleDataDrivenExample::SetsOfDataTest#metadataSet2
                    Setup: TestSetup
                    Teardown: TestCleanup
                    Property[Data:Color] = {Purple, Maroon, Brown}

                    Data[Color] = Brown

            WEX::TestExecution::Examples::SimpleDataDrivenExample::SecondNonDataDrivenTest
                    Setup: TestSetup
                    Teardown: TestCleanup


        f:\Examples\CSharp.DataDriven.Example.dll
        WEX.Examples.CSharpDataDrivenSimpleExample
                Setup: MyClassInitialize
                Property[Description] = Simple example in table-based data-driven tests

            WEX.Examples.CSharpDataDrivenSimpleExample.DataDrivenTest#0
                    Property[DataSource] = Table:CSharpDataDrivenSimpleExample.xml#SimpleTable

                    Data[Color] = White
                    Data[Size] = 4

            WEX.Examples.CSharpDataDrivenSimpleExample.DataDrivenTest#1
                    Property[DataSource] = Table:CSharpDataDrivenSimpleExample.xml#SimpleTable

                    Data[Color] = Black
                    Data[Size] = 10

            WEX.Examples.CSharpDataDrivenSimpleExample.DataDrivenTest#2
                    Property[DataSource] = Table:CSharpDataDrivenSimpleExample.xml#SimpleTable

                    Data[Color] = Orange
                    Data[Size] = 9

            WEX.Examples.CSharpDataDrivenSimpleExample.DataDrivenTest#3
                    Property[DataSource] = Table:CSharpDataDrivenSimpleExample.xml#SimpleTable

                    Data[Color] = Blue
                    Data[Size] = 9

            WEX.Examples.CSharpDataDrivenSimpleExample.NonDataDrivenTest
            WEX.Examples.CSharpDataDrivenSimpleExample.SetsOfMetadataTest#metadataSet0
                    Property[Data:Color] = {Red, Green, Blue}

                    Data[Color] = Red

            WEX.Examples.CSharpDataDrivenSimpleExample.SetsOfMetadataTest#metadataSet1
                    Property[Data:Color] = {Red, Green, Blue}

                    Data[Color] = Green

            WEX.Examples.CSharpDataDrivenSimpleExample.SetsOfMetadataTest#metadataSet2
                    Property[Data:Color] = {Red, Green, Blue}

                    Data[Color] = Blue

Lassen Sie uns jetzt die oben aufgeführten SetsOfMetadataTest und SetsOfDataTest ignorieren. Wenn Sie neugierig auf diese Themen sind, lesen Sie mehr über leichtgewichtiges, datengesteuertes Testen. Nachdem Sie nun die verschiedenen Eigenschaften und Datenparameternamen und -werte kennen, können Sie bestimmte Tests basierend darauf auswählen. Probieren Sie sie aus, und folgen Sie, um zu bestätigen, was Sie auswählen.

Führen Sie Folgendes aus, um nur die nicht datengesteuerten Tests auszuführen:

TE.exe Beispiele\CSharp.DataDriven.Example.dll Examples\CPP.DataDriven.Example.dll /select:"@Name='*Simple*' Und not(@DataSource=*)"

Um nur die datengetriebenen Tests auszuführen, bei denen die Farbe als "Schwarz" angegeben ist, führen Sie aus:

TE.exe Beispiele\CSharp.DataDriven.Example.dll Examples\CPP.DataDriven.Example.dll /select:"@Name='*Simple*' und @Data:Color='Black'"

Genau wie bei "Color" werden @Data:<DataDrivenParameterName>=<DataDrivenParameterValue> basierend auf dem angegebenen DataDriven-Parameterwert bestimmte Daten ausgeführt. Im obigen Fall wird WEX::TestExecution::Examples::SimpleDataDrivenExample::DataDrivenTest#1 und WEX::Examples::CSharpDataDrivenSimpleExample::DataDrivenTest#1 ausgeführt.

Beachten Sie die Testindizes in den oben genannten Listeneigenschaften. Sie können auch die oben aufgeführte Option basierend auf dem Index auswählen.

TE.exe Beispiele\CSharp.DataDriven.Example.dll Examples\CPP.DataDriven.Example.dll /select:"@Name='*Simple*' And @Data:Index=1"

Das Obige führt dieselben beiden Tests aus, die @Data:Color="Schwarz" ausgewählt hat. Sie fügen der Indexauswahl sogar Schutzvorrichtungen mit @Data:Index > lowerGuardValue und @Data:index< upperGuardValue hinzu.

Wenn Sie die Grundlagen der datengesteuerten Tests mit TAEF verstehen, folgen Sie der nächsten Klasse in denselben Beispielen: Überschreiben von Metadaten auf Zeilenebene, Angeben von Arrayparametertypen.