Datengesteuerte Klasse
Stellen Sie sicher, dass Sie mit der grundlegenden Ausführung von TAEF vertraut sind und wissen, wie Sie Tests erstellen können, bevor Sie mit diesem Abschnitt fortfahren. Sie können auch das einfache datengesteuerte Testbeispiel exemplarische Vorgehensweise durchgehen. In diesem Abschnitt erstellen Sie eine datengesteuerte Testklasse, die auf einem tabellenbasierten datengesteuerten Test basiert, aber der gleiche Ansatz gilt für WMI-basierte oder PICT-basierte datengesteuerte Tests.
Wann sollte eine datengesteuerte Klasse verwendet werden?
Es gibt Zeiten, in denen mehrere Tests von den gleichen Eingabedaten abhängen können. Beim Testen von APIs können Sie mehrere API-Tests mit denselben Daten ausführen, um eine konsistente Ansicht des API-Verhaltens zu erhalten. Wenn Sie Tests auf Szenarioebene durchführen, sollten Sie sicherstellen, dass alle Schritte in Ihrem Szenario mit den gleichen Daten getestet werden. In diesen Zeiten ist es nützlich, die Testdaten auf Klassenebene anzugeben.
Erstellen datengesteuerter Klasse
Sie geben an, dass eine bestimmte Klasse datengesteuert ist, ähnlich wie Sie angeben, dass ein bestimmter Test datengesteuert ist. Sie wenden die DataSource-Metadaten auf Klassenebene an. Der Wert identifiziert die jeweilige Datenquelle, die von Interesse ist. Das folgende Beispiel zeigt, wie Diese Eigenschaften für datengesteuerte Klassen angegeben werden:
Nativer Code
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 };
Verwalteter Code
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 }
In diesen Beispielen werden Zeile 3 im nativen Codebeispiel und Zeile 5 im Beispiel für verwalteten Code als empfohlene Methoden zum Angeben der Datenquelle für eine datengesteuerte Testklasse in TAEF empfohlen.
Im obigen Beispiel für verwalteten Code zeigen die Zeilen 13, 18, 24 und 28, wie Daten den Testmethoden für verwalteten Code zur Verfügung gestellt werden.
Im folgenden Codebeispiel zeigen die Zeilen 4, 11, 20 und 27, wie Daten für die Testmethoden für nativen Code zur Verfügung gestellt werden. Beachten Sie, dass Sie die Daten, die Sie in der Tabelle (Zeilen) der datengesteuerten Klasse definiert haben, den Testmethoden in der Klasse (Test1 und Test2) auf die gleiche Weise zur Verfügung stellen wie bei einem datengesteuerten Test.
Sie erstellen die DataSource-XML-Datei für eine datengesteuerte Klasse genauso wie für einen datengesteuerten Test. Die folgenden Beispiele zeigen die XML-Dateien für native und verwaltete Klassen.
Ursprünglich
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>
Verwalteten
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>
Hinter den Kulissen ODER Was erwartet Sie?
Wenn Sie Tests in TAEF erstellen, ist die Ausführungsreihenfolge innerhalb einer Klasse standardmäßig mit der Reihenfolge identisch, in der Sie die Testmethoden in der -Klasse codiert haben. In den vorherigen Beispielen wird Test1 daher immer vor Test2 ausgeführt. Da die Klasse, die Test1 und Test2 enthält, eine datengesteuerte Klasse ist, werden alle Klassenmethoden einmal für jede Datenzeile ausgeführt, die Sie in DataSource definiert haben. Mit anderen Worten: Test1 und Test2 werden für Zeile #0 ausgeführt. Anschließend werden diese Methoden in der gleichen Reihenfolge für Zeile 1 usw. ausgeführt, bis TAEF alle Zeilen ausführt.
Ausführen von Tests in einer datengesteuerten Klasse
Wenn Sie die Beispieltestbinärdateien mit der Befehlsoption /list ausführen, wird die Ausführungsreihenfolge aus dem vorherigen Abschnitt klar.
Ursprünglich
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
Verwalteten
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
Beachten Sie, dass die Indizes in den obigen Beispielen datengesteuerten Tests ähneln. Jede Zeile in der datengesteuerten Klasse wird durch einen Index identifiziert. Genau wie bei datengesteuerten Tests können Sie jeder Zeile einen aussagekräftigeren Kurznamen geben, indem Sie die Metadaten auf Zeilenebene in der XML-Datei angeben und diesen Namen anstelle des Index ausgeben, wenn sie die Tests auflisten oder ausführen.
Ebenso verwenden Sie die Option /listproperties , um zu bestätigen, dass die Daten tatsächlich angegeben und auf Klassenebene verfügbar sind.
Ursprünglich
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
Verwalteten
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
Sie können alle Ausführungsregeln auf die datengesteuerte Klasse anwenden. Sie können ihre Auswahlabfrage auf alles stützen, was Sie in der Option /listproperties auflisten können.
Datengesteuerte Tests in einer datengesteuerten Klasse
Sie sind in keiner Weise darauf beschränkt, datengesteuerte Tests innerhalb einer datengesteuerten Klasse durchzuführen. Dieser Ansatz kann beim Schreiben von API-Tests nützlich sein. Sie können die allgemeinen Daten für alle Tests in einer Klasse auf Der Klassenebene DataSource beibehalten. Sie geben die Daten an, die testmethodespezifisch in den DataSource-Metadaten für die Methode sind, die Sie als datengesteuert markieren.
HINWEIS: In solchen Fällen ist die Ausführungsreihenfolge etwas stärker involviert.
Die folgenden Beispiele zeigen, wie die beiden vorherigen Beispielbinärdateien mit der Befehlsoption /list gerendert werden.
Ursprünglich
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
Verwalteten
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
HINWEIS: Die einzige Einschränkung besteht in diesem Fall darin, dass sich die Tabellen für die beiden Beispiele nicht in derselben DataSource-Datei befinden können. Anders ausgedrückt: Die Datenquelle für die datengesteuerte Klasse und die darin enthaltene datengesteuerte Testmethode müssen unterschiedlich sein.
Beachten Sie, dass die Methode Test2 in unseren Beispielen ein datengesteuerter Test innerhalb einer datengesteuerten Klasse ist. Beispiel: in der Zeile WEX. Examples.CSharpDataDrivenNestedExample#3.Test2#0, #3 ist der Index für die Klasse, und #0 ist der Index für den datengesteuerten Test innerhalb dieser Klasse. Test2 kann auf beide Tabellen zugreifen: auf die Daten in der Zeile der Klasse instance der sie gehört, und auf die Daten in der aktuellen Zeile für die eigene DataSource-Tabelle. Anders ausgedrückt: Die Daten auf Klassenebene und die Daten auf Testmethodenebene werden zusammen aggregiert und stehen während der Testmethodenausführung zur Verfügung.
Was geschieht bei in Konflikt stehenden Daten, wenn derselbe Datenname sowohl auf Klassen- als auch auf Methodenebene angegeben wird? TAEF verarbeitet diese Bedingung auf die gleiche Weise wie Metadateneigenschaften. Die Daten, die in einer Zeile auf Methodenebene angegeben werden, setzen die Daten außer Kraft, die in einer Zeile auf Klassenebene angegeben sind.
Betrachten Sie beispielsweise den Fall, wenn Sie einen Parameter mit dem Namen Size haben, der sowohl auf Klassenebene als auch auf Testmethodenebene angegeben wird. Auf Klassenebene ist Size als Zeichenfolgenarray-Typ definiert, auf Testmethodenebene wird sie jedoch als int definiert. In diesem Fall überschreibt der int-Typ den String Array-Typ auf Testmethodenebene sowie die Setup- und Teardown-Methoden für den Test. Bei den Setup- und Teardown-Methoden auf Klassenebene weist Size jedoch den Datentyp String Array auf .
Wenn Sie solche datenkonfliktierenden Daten im Code haben, zeigt TAEF während der Ausführung eine Warnung an und listet die Eigenschaften auf, aber die in Konflikt stehenden Daten führen nicht zu einem Fehler.