Einfaches datengesteuertes Testbeispiel
In diesem Abschnitt werden mehrere Beispiele für datengesteuerte Tests beschrieben und spezifische Features in jedem Beispiel behandelt.
Das erste Beispiel ist ein einfacher datengesteuerter 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 datengesteuerten Test, der verwendet werden soll. Der oberste XML-Knoten ist das <Data-Tag> , das ein oder mehrere <darin definierte Tabellentags> enthalten kann. Jede Tabelle muss einem eindeutigen "ID"-Attribut zugeordnet werden. Die Testfunktionen verwenden den Tabellen-ID-Wert, um die bestimmte Tabelle zu identifizieren, die sie in der XML-Datei verwenden.
<Im Table-Tag> verfügen Sie über einen optionalen< Abschnitt ParameterTypes>. Hier können Sie den Datentyp für einen bestimmten Parameter mithilfe von ParameterTypes-Tags<> explizit angeben. Im obigen Beispiel geben Sie explizit an, dass der Parameter "Size" vom Typ "Int32" und der Parameter "Color" eine Zeichenfolge ist. Zusammenfassend: Der Abschnitt ParameterTypes ist optional. Wenn keine Parametertypinformationen bereitgestellt werden, werden sie standardmäßig als Zeichenfolge gespeichert.
Wenn Sie die Verwalteten und nativen Beispiele vergleichen, werden Sie feststellen, dass der einzige Unterschied zwischen den beiden der <ParameterTypes-Block> ist. Die native XML-Datei gibt die Größe an, um den nativen ganzzahligen Typ "int" zu haben, und verwendet den Standardtyp WEX::Common::String, um den Typ für Color zu verwenden, indem er nicht angegeben wird. Zur Vereinfachung zeigt das folgende Beispiel die XML-Datei aus dem nativen 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 in nativem und verwaltetem Code unterstützten Parametertypen sind unter Parametertypen in Tabellendatenquellen aufgeführt.
Wenn ein anderer Datentyp angegeben wird, löst der Test eine Warnung aus und betrachtet ihn als Zeichenfolge.
Wenn Sie mit den XML-Dateien fortfahren, verfügen Sie nach dem <ParameterTypes-Block> in beiden XML-Dateien über identische Zeilensätze<>, die jeweils einem Satz von Daten in unseren verwalteten und nativen Beispielen entsprechen. In diesem speziellen Fall verfügen Sie über 4 Datensätze, die über 4 <Zeilenblöcke> definiert sind, wobei jeweils die Werte der Parameter mithilfe der <Parametertags> angegeben werden.
Dies deckt die wesentlichen Grundlagen der verschiedenen Teile der Datenquellendatei ab. Nun sehen wir uns an, wie Sie die Werte abrufen können, die Sie in der obigen XML-Datei angegeben haben.
Erstellungstest als datengesteuerter Test
Nachdem die Daten angegeben wurden, benötigen Sie eine Möglichkeit, den Code oder die Testmethode, die die Daten in der XML-Datei nutzt, zuzuordnen. Hierzu geben Sie - sowohl im verwalteten als auch im nativen Beispiel - die Metadaten "DataSource" an. Die DataSource-Metadaten bestehen aus drei Teilen:
- 'Table:' – Dadurch wird die Datenquelle als XML-Tabelle identifiziert.
- "DataDrivenTests.xml": Dies ist die Datei, die die XML-Tabelle enthält.
- "#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 sucht die XML-Datei nach einem Table-Element mit einem Attribut "Id", das dem angegebenen Wert entspricht.
Noch einmal werfen wir einen kurzen Blick auf den Code, der die oben genannten Aspekte abdeckt.
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.
Darüber hinaus benötigen Sie einige zusätzliche Schritte für datengesteuerte Tests in verwaltetem Code. Sie müssen auch eine private TestContext-Eigenschaft definieren. Weitere Informationen finden Sie unter TestContext-Klasse. Sie definieren auch öffentliche Bewertungen für diese Eigenschaft. Intern legt TAEF diese TestContext-Eigenschaft fest, damit Sie über sie auf die Daten zugreifen können. Lassen Sie uns einen kurzen Blick auf diesen Teil des Codes werfen:
1 public TestContext TestContext
2 {
3 get;
4 set;
5 }
Abrufen von Daten in der Testmethode
Die Abruf-APIs unterscheiden sich in verwaltetem und nativem Code. Beginnen wir mit dem Verständnis der nativen 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 abgerufenen Daten zu speichern. Es ist wichtig, den Typ hier genau zu erhalten. Da Sie "Size" als "int"-Typ in der XML-Datei definiert haben, müssen Sie eine lokale Variable vom Typ int definieren, um sie abzurufen. Die Abruf-API nimmt den Namen des abzurufenden Parameters als String-Wert als ersten Parameter an. Der zweite Parameter ist die lokale Variable, die als Verweis übergeben und durch TAEF-Code festgelegt wird.
Diese Abruf-API ist in TestData.h definiert und vom WexTestClass.h-Header enthalten, den alle TAEF-Tests enthalten.
Um die Daten im verwalteten Code abzurufen, verwenden Sie die von Ihnen definierte TestContext-Eigenschaft. Sehen Sie sich den code unten 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 sich das Beispiel ansehen, gibt es auch einen nicht datengesteuerten Test in derselben Klasse. Anders ausgedrückt: 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 Tests mit TAEF ausführen , bevor Sie mit Tipps und Tricks zum Ausführen von DataDrivenTests mit TAEF beginnen. Es kann hilfreich sein, Ihren Arbeitsspeicher hinsichtlich der Funktionsweise der Auswahl mit TAEF zu aktualisieren.
Die Eingabeaufforderung zum Ausführen datengesteuerter Tests unterscheidet sich nicht sehr von der Ausführung eines generischen Tests mit TAEF. Führen Sie einfach den folgenden Befehl aus, um beide Beispiele (nativ und verwaltet) auszuführen, die oben beschrieben werden:
TE.exe Examples\CPP.DataDriven.Example.dll Examples\CSharp.DataDriven.Example.dll /name:*Simple*
"/name" fügt ein Auswahlkriterium basierend auf dem Namen 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
Vorerst ignorieren wir die oben aufgeführten SetsOfMetadataTest und SetsOfDataTest. Wenn Sie darauf neugierig sind, lesen Sie mehr unter Leichtes datengesteuertes Testen. Nachdem Sie nun die verschiedenen Eigenschaften sowie den Namen und die Werte des Data-Parameters kennen, können Sie darauf basierend bestimmte Tests auswählen. Probieren Sie sie aus, und folgen Sie ihnen, um zu bestätigen, was Sie auswählen.
Führen Sie Folgendes aus, um nur die nicht datengesteuerten Tests auszuführen:
TE.exe Examples\CSharp.DataDriven.Example.dll Examples\CPP.DataDriven.Example.dll /select:"@Name='*Simple*' And not(@DataSource=*)"
Führen Sie nun folgendes aus, um nur die datengesteuerten Tests auszuführen, bei denen die Farbe als "Schwarz" angegeben ist:
TE.exe Examples\CSharp.DataDriven.Example.dll Examples\CPP.DataDriven.Example.dll /select:"@Name='*Simple*' and @Data:Color='Black'"
Genau wie bei "Color" führt @Data:<DataDrivenParameterName>=<DataDrivenParameterValue> bestimmte Daten basierend auf dem angegebenen DataDriven-Parameterwert aus. Im obigen Fall werden WEX::TestExecution::Examples::SimpleDataDrivenExample::D ataDrivenTest#1 und WEX ausgeführt. Examples.CSharpDataDrivenSimpleExample.DataDrivenTest#1
Beachten Sie die Testindizes in den obigen Listeneigenschaften. Sie können den oben genannten auch basierend auf dem Index auswählen.
TE.exe Examples\CSharp.DataDriven.Example.dll Examples\CPP.DataDriven.Example.dll /select:"@Name='*Simple*' And @Data:Index=1"
Im obigen Fall werden die gleichen beiden Tests ausgeführt, die @Data:Color="Schwarz" ausgewählt haben. Sie fügen der Indexauswahl sogar Guards mit @Data:Index > lowerGuardValue und @Data:index< upperGuardValue hinzu.
Wenn Sie die Grundlagen des datengesteuerten Testens mit TAEF verstehen, folgen Sie der nächsten Klasse in denselben Beispielen: Überschreiben von Metadaten auf Zeilenebene, Angeben von Arrayparametertypen.