Ausführungsgruppen
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 einige datengesteuerte Testbeispiele exemplarische Anleitungen durchgehen, die im Benutzerhandbuch aufgeführt sind.
Szenariobasierte Tests mit TAEF
Wenn Sie über Tests auf Szenarioebene sprechen, sprechen Sie wirklich von einer Reihe von Tests, bei denen die Ausführung des nächsten Tests nur dann sinnvoll ist, wenn der vorherige Test im Szenario erfolgreich war. In einigen Fällen verfügen Sie möglicherweise nicht einmal über alle Informationen, die Sie zum Ausführen des nächsten Tests benötigen, wenn der vorherige Test fehlgeschlagen ist. Zu diesem Zweck unterstützt TAEF die sogenannten ExecutionGroups, während die Ausführungseinheit als Testmethode beibehalten wird und Testszenarien zugelassen werden. Sie können szenariobasierte Tests in TAEF unabhängig von anderen Features wie datengesteuertem Testen durchführen. Wenn Sie Ihr Szenario so entwerfen, dass datengesteuerte Tests genutzt werden, können Sie datengesteuerte Unterstützung auf Klassenebene mithilfe der von TAEF angebotenen datengesteuerten Klassenfunktionen anwenden. Wenn Sie datengesteuerte Unterstützung auf Klassenebene anwenden, können Sie alle Tests innerhalb Ihrer Klasse sequenziell für jede Zeile ausführen lassen.
Auf dieser Seite wird erläutert, wie Sie eine Testsequenz innerhalb einer Klasse als "ExecutionGroup" angeben.
Ausführungsgruppen
Vor der Besprechung von Ausführungsgruppen sollten Sie beachten und beachten, dass in TAEF die Reihenfolge der Ausführung von Tests innerhalb einer Klasse die Reihenfolge ist, in der Sie sie bei nativem Code als TEST_METHOD(...) qualifiziert oder die [TestMethod]-Eigenschaft vor der Methode im Fall von verwaltetem Code hinzugefügt haben. TAEF garantiert nicht die Reihenfolge der Ausführung der Klassen selbst.
Bei szenariobasierten Tests reicht es möglicherweise nicht aus, nur die Reihenfolge der Ausführung zu garantieren. Sie müssen auch sicherstellen, dass alle vorherigen Tests im Szenario erfolgreich waren, bevor Sie mit dem nächsten Test im Szenario fortfahren. Hier finden Sie das Konzept von "ExecutionGroup", um nützlich zu sein.
Betrachten Sie ein natives Beispiel:
1 class ExecutionDependencyExample
2 {
3 BEGIN_TEST_CLASS(ExecutionDependencyExample)
4 TEST_CLASS_PROPERTY(L"ExecutionGroup", L"DependentTests")
5 END_TEST_CLASS()
6
7 TEST_METHOD(Test1)
8 {
9 Log::Comment(L"Test1 passes.");
10 }
11
12 TEST_METHOD(Test2)
13 {
14 Log::Comment(L"Test2 fails.");
15 VERIFY_ARE_EQUAL(2, 3);
16 }
17
18 TEST_METHOD(Test3)
19 {
20 Log::Comment(L"Test3 is blocked; so you shouldn't see this.");
21 }
22 };
Siehe Zeile 4 im C++-Dateiausschnitt oben. In diesem speziellen Fall qualifizieren Sie alle Tests innerhalb des Class ExecutionDependencyExample so, dass sie zu einer "ExecutionGroup" namens "DependentTests" gehören. Dies bedeutet, dass "Test1", "Test2" und "Test3" Teil der Ausführungsgruppe "DependentTests" sind. Wie bereits erwähnt, wird Test2 nur ausgeführt, wenn Test1 erfolgreich ausgeführt wird und erfolgreich ist. Auf ähnliche Weise wird Test3 ausgeführt, wenn Test2 erfolgreich ausgeführt wird und erfolgreich ist.
Sie sehen, dass Test2 für Fehler konzipiert wurde (siehe zeilen 14 und 15 oben).
Da Test2 in "DependentTests" "ExecutionGroup" fehlschlägt, wird Test3 nicht ausgeführt und stattdessen als blockiert markiert. Versuchen wir, den obigen Test auszuführen und zu prüfen, ob dies tatsächlich der Fall ist.
te Examples\CPP.ExecutionDependency.Example.dll
Test Authoring and Execution Framework v2.93k for x86
StartGroup: WEX::TestExecution::Examples::ExecutionDependencyExample::Test1
Test1 passes.
EndGroup: WEX::TestExecution::Examples::ExecutionDependencyExample::Test1
[Passed]
StartGroup: WEX::TestExecution::Examples::ExecutionDependencyExample::Test2
Test2 fails.
Error: Verify: AreEqual(2, 3) - Values (2, 3) [File: >f:source\executiondependencyexample\executiondependencyexample.cpp,
Function: WEX::TestExecution::Examples::ExecutionDependencyExample::Test2, Line:21]
EndGroup: WEX::TestExecution::Examples::ExecutionDependencyExample::Test2[Failed]
StartGroup: WEX::TestExecution::Examples::ExecutionDependencyExample::Test3
Blocked: This test belongs to an execution group and depends on the previous test being executed in the same environment successfully. The dependent test must be selected for execution, must request the same execution environment (e.g. 'ThreadingModel') and must be executed successfully.
EndGroup: WEX::TestExecution::Examples::ExecutionDependencyExample::Test3 [Blocked]
Non-passing Tests:
WEX::TestExecution::Examples::ExecutionDependencyExample::Test2 [Failed]
WEX::TestExecution::Examples::ExecutionDependencyExample::Test3 [Blocked]
Summary: Total=3, Passed=1, Failed=1, Blocked=1, Not Run=0, Skipped=0
Beachten Sie, dass Test1 wie vorhergesagt erfolgreich, Test2 fehlgeschlagen und Test3 blockiert wurde. Mit Test3 protokolliert TAEF eine Meldung, dass Test3 zu einer Ausführungsgruppe gehört und der vorherige Test nicht erfolgreich ausgeführt wurde.
Diese Fehlermeldung besagt auch, dass alle Tests ausgewählt werden sollen, bevor der aktuelle Test ausgeführt wird, die zu derselben ExecutionGroup gehören. Mit anderen Worten, wenn Sie versuchen, nur Test2 mit einem Auswahlkriterium zur Laufzeit auszuführen, werden Sie feststellen, dass Test2 blockiert wird, da die Ausführung von Test1 abhängig ist und Teil derselben ExecutionGroup ist.
te Examples\CPP.ExecutionDependency.Example.dll /name:*Test2*
Test Authoring and Execution Framework v2.9.3k for x86
StartGroup: WEX::TestExecution::Examples::ExecutionDependencyExample::Test2
Blocked: This test belongs to an execution group and depends on the previous test being executed in the same environment successfully. The dependent test must be selected for execution, must request the same execution environment (e.g. 'ThreadingModel') and must be executed successfully.
EndGroup: WEX::TestExecution::Examples::ExecutionDependencyExample::Test2 [Blocked]
Summary: Total=1, Passed=0, Failed=0, Blocked=1, Not Run=0, Skipped=0
Wenn Sie jedoch Test1 auswählen, was der erste Test in der ExecutionGroup ist, wird er erfolgreich ausgeführt.
te Examples\CPP.ExecutionDependency.Example.dll /name:*Test1*
Test Authoring and Execution Framework v2.9.3k for x86
StartGroup: WEX::TestExecution::Examples::ExecutionDependencyExample::Test1
Test1 passes.
EndGroup: WEX::TestExecution::Examples::ExecutionDependencyExample::Test1 [Passed]
Summary: Total=1, Passed=1, Failed=0, Blocked=0, Not Run=0, Skipped=0
Außerdem werden Tests, die nicht zur ExecutionGroup gehören, unabhängig vom Ausführungsergebnis der Tests innerhalb der ExecutionGroup ausgeführt. Es ist auch möglich, mehr als eine ExecutionGroup innerhalb einer Klasse zu haben. Beachten Sie jedoch, dass ExecutionGroup nicht klassenübergreifend sein kann. Wenn Sie dies tun, werden sie stattdessen als zwei separate ExecutionGroups betrachtet, eine in jeder Klasse.
Die Meldung besagt auch, dass Test3 in derselben Umgebung wie Test2 ausgeführt werden soll. Versuchen wir, diesen Aspekt etwas ausführlicher zu verstehen. Da ein Teil einer ExecutionGroup wirklich bedeutet, Teil des szenariobasierten Tests zu sein, wird es von entscheidender Bedeutung, dass alle Tests anfordern und daher in derselben Umgebung ausgeführt werden. Für instance werden blockierte Tests angezeigt, wenn sich das Threadingmodell in einer ExecutionGroup ändert. Wenn test2 im obigen Beispiel beispielsweise für die erfolgreiche Ausführung konzipiert wurde, aber die Eigenschaft "ThreadingModel" auf "MTA" festgelegt wurde, wird Test3 weiterhin blockiert.
Betrachten wir ein weiteres Beispiel: Examples\TAEF\CSharp\ExecutionDependentGroupsExample (siehe aktuelle TAEF-Releasefreigabe)
1 [TestClass]
2 public class CSharpExecutionDependentGroupsExample
3 {
4 //First Execution Group: Test1, Test2
5 [TestMethod]
6 [TestProperty("ExecutionGroup", "First Execution Group")]
7 public void Test1()
8 {
9 Log.Comment("Part of First Execution Group");
10 }
11 [TestMethod]
12 [TestProperty("ExecutionGroup", "First Execution Group")]
13 public void Test2()
14 {
15 Log.Comment("Part of First Execution Group");
16 }
17
18 //Second Execution Group: Test3, Test4. Test4 fails
19 [TestMethod]
20 [TestProperty("ExecutionGroup", "Second Execution Group")]
21 public void Test3()
22 {
23 Log.Comment("Part of Second Execution Group");
24 }
25 [TestMethod]
26 [TestProperty("ExecutionGroup", "Second Execution Group")]
27 public void Test4()
28 {
29 Log.Comment("Part of Second Execution Group - last in group fails");
30 Verify.IsTrue(false);
31 }
32
33 //Third Execution Group: Test5, Test6, Test7. Test6 fails, Test7 will be blocked.
34 [TestMethod]
35 [TestProperty("ExecutionGroup", "Third Execution Group")]
36 public void Test5()
37 {
38 Log.Comment("Part of Third Execution Group");
39 }
40 [TestMethod]
41 [TestProperty("ExecutionGroup", "Third Execution Group")]
42 public void Test6()
43 {
44 Log.Comment("Part of Third Execution Group - middle in this set of 3 fails");
45 Verify.IsTrue(false);
46 }
47 [TestMethod]
48 [TestProperty("ExecutionGroup", "Third Execution Group")]
49 public void Test7()
50 {
51 Log.Comment("Part of Third Execution Group");
52 }
53
54 //Fourth Execution Group: Test8, Test9
55 [TestMethod]
56 [TestProperty("ExecutionGroup", "Fourth Execution Group")]
57 public void Test8()
58 {
59 Log.Comment("Part of Fourth Execution Group");
60 }
61 [TestMethod]
62 [TestProperty("ExecutionGroup", "Fourth Execution Group")]
63 public void Test9()
64 {
65 Log.Comment("Part of Fourth Execution Group");
66 }
67 }
Dieses Beispiel umfasst vier verschiedene Ausführungsgruppen:
- "Erste Ausführungsgruppe" enthält Test1, Test2; Beides sollte erfolgreich bestanden werden.
- "Zweite Ausführungsgruppe" enthält Test3 und Test4. Test4 ist der letzte Test in dieser ExecutionGroup und schlägt fehl.
- "Dritte Ausführungsgruppe" enthält Test5, Test6 und Test7. Test5 wird ausgeführt und erfolgreich bestanden, obwohl Test4 aus der vorherigen ExecutionGroup fehlgeschlagen ist. Test6 ist für Fehler konzipiert, was dazu führt, dass Test7 blockiert wird.
- "Vierte Ausführungsgruppe" enthält Test8 und Test9. Obwohl Test7 aus der vorherigen ExecutionGroup aufgrund eines Fehlers von Test6 blockiert wurde, wird Test8 erfolgreich ausgeführt und test9.
Um die ExecutionGroups in diesem Beispiel besser zu verstehen, listen wir die Eigenschaften in diesem Beispiel auf.
te Examples\CSharp.ExecutionDependentGroups.Example.dll /listproperties
Test Authoring and Execution Framework v2.9.3k for x86
F:\ \Examples\CSharp.ExecutionDependentGroups.Example.dll
WEX.Examples.CSharpExecutionDependentGroupsExample
WEX.Examples.CSharpExecutionDependentGroupsExample.Test1
Property[ExecutionGroup] = First Execution Group
WEX.Examples.CSharpExecutionDependentGroupsExample.Test2
Property[ExecutionGroup] = First Execution Group
WEX.Examples.CSharpExecutionDependentGroupsExample.Test3
Property[ExecutionGroup] = Second Execution Group
WEX.Examples.CSharpExecutionDependentGroupsExample.Test4
Property[ExecutionGroup] = Second Execution Group
WEX.Examples.CSharpExecutionDependentGroupsExample.Test5
Property[ExecutionGroup] = Third Execution Group
WEX.Examples.CSharpExecutionDependentGroupsExample.Test6
Property[ExecutionGroup] = Third Execution Group
WEX.Examples.CSharpExecutionDependentGroupsExample.Test7
Property[ExecutionGroup] = Third Execution Group
WEX.Examples.CSharpExecutionDependentGroupsExample.Test8
Property[ExecutionGroup] = Fourth Execution Group
WEX.Examples.CSharpExecutionDependentGroupsExample.Test9
Property[ExecutionGroup] = Fourth Execution Group
Wenn Sie den obigen Test ausführen, bestätigt die folgende Ausgabe die vorhergesagte Ausführungsreihenfolge.
te Examples\CSharp.ExecutionDependentGroups.Example.dll
Test Authoring and Execution Framework v2.9.3k for x86
StartGroup: WEX.Examples.CSharpExecutionDependentGroupsExample.Test1
Part of First Execution Group
EndGroup: WEX.Examples.CSharpExecutionDependentGroupsExample.Test1 [Passed]
StartGroup: WEX.Examples.CSharpExecutionDependentGroupsExample.Test2
Part of First Execution Group
EndGroup: WEX.Examples.CSharpExecutionDependentGroupsExample.Test2 [Passed]
StartGroup: WEX.Examples.CSharpExecutionDependentGroupsExample.Test3
Part of Second Execution Group
EndGroup: WEX.Examples.CSharpExecutionDependentGroupsExample.Test3 [Passed]
StartGroup: WEX.Examples.CSharpExecutionDependentGroupsExample.Test4
Part of Second Execution Group - last in group fails
Error: Verify: IsTrue [File: Need_Symbols, Function: Test4, Line: 0]
Error: [HRESULT: 0x80131604]. Operation failed: 'WEX.Examples.CSharpExecutionDependentGroupsExample.Test4'.
EndGroup: WEX.Examples.CSharpExecutionDependentGroupsExample.Test4 [Failed]
StartGroup: WEX.Examples.CSharpExecutionDependentGroupsExample.Test5
Part of Third Execution Group
EndGroup: WEX.Examples.CSharpExecutionDependentGroupsExample.Test5 [Passed]
StartGroup: WEX.Examples.CSharpExecutionDependentGroupsExample.Test6
Part of Third Execution Group - middle in this set of 3 fails
Error: Verify: IsTrue [File: Need_Symbols, Function: Test6, Line: 0]
Error: [HRESULT: 0x80131604]. Operation failed: 'WEX.Examples.CSharpExecutionDependentGroupsExample.Test6'.
EndGroup: WEX.Examples.CSharpExecutionDependentGroupsExample.Test6 [Failed]
Error: WEX.Examples.CSharpExecutionDependentGroupsExample.Test7 belongs to an execution group and depends
on the previous test being executed in the same environment successfully.
Error: Please make sure that the dependent test is selected for execution, requests the same execution .
environment metadata(e.g. 'ThreadingModel') and that it executed successfully.
StartGroup: WEX.Examples.CSharpExecutionDependentGroupsExample.Test7
Blocked EndGroup: WEX.Examples.CSharpExecutionDependentGroupsExample.Test7 [Blocked]
StartGroup: WEX.Examples.CSharpExecutionDependentGroupsExample.Test8
Part of Fourth Execution Group
EndGroup: WEX.Examples.CSharpExecutionDependentGroupsExample.Test8 [Passed]
StartGroup: WEX.Examples.CSharpExecutionDependentGroupsExample.Test9
Part of Fourth Execution Group
EndGroup: WEX.Examples.CSharpExecutionDependentGroupsExample.Test9 [Passed]
Failed Tests:
WEX.Examples.CSharpExecutionDependentGroupsExample.Test4
WEX.Examples.CSharpExecutionDependentGroupsExample.Test6
Summary: Total=9, Passed=6, Failed=2, Blocked=1, Not Run=0, Skipped=0
Beachten Sie, dass die Testausführungsreihenfolge erwartungsgemäß ist.