Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Przed kontynuowaniem tej sekcji upewnij się, że znasz podstawowe wykonywanie funkcji TAEF i wiesz, jak tworzyć testy przy użyciu tej funkcji. Możesz również zapoznać się z przykładowym przewodnikiem dotyczącym testu opartego na danych wymienionym w podręczniku użytkownika.
Scenario-Based Testowanie za pomocą TAEF
Kiedy mówisz o testowaniu na poziomie scenariusza, naprawdę mówisz o serii testów, gdzie wykonywanie następnego testu ma sens tylko wtedy, gdy poprzedni test w scenariuszu zakończył się pomyślnie. W niektórych przypadkach może nawet nie zawierać wszystkich informacji potrzebnych do wykonania następnego testu, jeśli poprzedni test zakończył się niepowodzeniem. W tym celu, zachowując jednostkę wykonywania jako metodę testową i umożliwiając scenariusze testowe, TAEF obsługuje tak zwane "ExecutionGroup". Testy oparte na scenariuszach można wykonywać w modelu TAEF niezależnie od tego, czy nadal mają inne funkcje, takie jak testowanie oparte na danych. Jeśli projektujesz swój scenariusz w celu korzystania z testowania opartego na danych, możesz zastosować obsługę opartą na danych na poziomie klasy przy użyciu funkcji klasy opartej na danych oferowanych przez taEF. Stosując obsługę opartą na danych na poziomie klasy, wszystkie testy w klasie można wykonać sekwencyjnie dla każdego wiersza.
Ta strona koncentruje się na sposobie określania sekwencji testów w klasie jako "ExecutionGroup".
Grupy wykonywania
Przed omówieniem grup wykonywania należy pamiętać, że w metodzie TAEF kolejność wykonywania testów w klasie jest kolejnością, w której zostały zakwalifikowane jako TEST_METHOD(...) w przypadku kodu natywnego lub dodano właściwość [TestMethod] przed metodą w przypadku kodu zarządzanego. TAEF nie gwarantuje kolejności wykonywania klas.
W testach opartych na scenariuszach samo zagwarantowanie kolejności wykonywania może być niewystarczające; należy również zagwarantować, że wszystkie poprzednie testy w scenariuszu zakończyły się pomyślnie, zanim przejdziesz do następnego testu w scenariuszu. W tym miejscu znajdziesz pojęcie "ExecutionGroup", które będzie przydatne.
Rozważmy przykład rodzimy:
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 };
Zobacz wiersz 4 w powyższym fragmencie pliku języka C++. W tym konkretnym przypadku kwalifikujesz wszystkie testy w ramach klasy ExecutionDependencyExample, aby należeć do "ExecutionGroup" o nazwie "DependentTests". Oznacza to, że "Test1", "Test2" i "Test3" są częścią grupy wykonawczej "TestyZależne". Jak wspomniano wcześniej, test2 zostanie wykonany, jeśli i tylko wtedy, gdy test1 zostanie wykonany pomyślnie i przejdzie pomyślnie. Podobnie test3 zostanie wykonany, jeśli i tylko wtedy, gdy test2 zostanie wykonany pomyślnie i przejdzie pomyślnie.
Zobaczysz, że test2 został zaprojektowany do niepowodzenia (zobacz wiersze 14 i 15 powyżej).
Ponieważ test2 kończy się niepowodzeniem w parametrze "DependentTests" "ExecutionGroup", test3 nie zostanie wykonany i zamiast tego zostanie oznaczony jako zablokowany. Spróbuj uruchomić powyższy test i sprawdź, czy jest to rzeczywiście prawda.
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
Zwróć uwagę, że zgodnie z przewidywaniami test1 zakończył się powodzeniem, test2 zakończył się niepowodzeniem i test3 został zablokowany. W przypadku Test3, TAEF rejestruje komunikat informujący, że Test3 należy do grupy wykonawczej, a poprzedni test nie został wykonany pomyślnie.
Ten komunikat o błędzie informuje również, że należy wybrać wszystkie testy przed wykonaniem bieżącego testu należącego do tej samej grupy ExecutionGroup. Innymi słowy, jeśli spróbujesz uruchomić tylko test2 przy użyciu kryteriów wyboru w czasie wykonywania, okaże się, że test2 zostanie zablokowany, ponieważ jest to wykonanie zależne od test1, będące częścią tej samej grupy ExecutionGroup.
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
Jeśli jednak wybierzesz pozycję Test1, czyli pierwszy test w grupie ExecutionGroup, zostanie uruchomiony pomyślnie.
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
Ponadto, jeśli masz testy, które nie należą do ExecutionGroup, zostaną one wykonane niezależnie od wyniku działania testów poprzedzających je w ExecutionGroup. Istnieje również możliwość posiadania więcej niż jednej grupy ExecutionGroup w klasie. Należy jednak pamiętać, że grupa ExecutionGroup nie może obejmować klas. Jeśli to zrobisz, zostaną one zamiast tego potraktowane jako dwie oddzielne ExecutionGroups, po jednej w każdej klasie.
Komunikat informuje również, że test3 powinien być uruchamiany w tym samym środowisku co Test2. Spróbujmy zrozumieć ten aspekt w nieco bardziej szczegółowy sposób. Ponieważ bycie częścią Grupy Wykonawczej naprawdę oznacza uczestnictwo w teście scenariuszowym, niezwykle ważne jest, żeby wszystkie testy były zgłaszane i wykonywane w tym samym środowisku. Na przykład jeśli model wątkowy zmieni się w grupie ExecutionGroup, zostaną wyświetlone zablokowane testy. Jeśli na przykład w powyższym przykładzie Test2 został zaprojektowany do pomyślnego wykonania, ale miał właściwość "ThreadingModel" ustawioną na "MTA", Test3 nadal będzie blokowany.
Rozważmy inny przykład: Examples\TAEF\CSharp\ExecutionDependentGroupsExample (zapoznaj się z najnowszym wydaniem TAEF)
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 }
W tym przykładzie są 4 różne grupy wykonywania:
- "Grupa pierwszego wykonania" zawiera Test1, Test2; oba testy powinny zostać pomyślnie zaliczone.
- "Druga Grupa Egzekucji" zawiera Test3 i Test4. Test4 jest ostatnim testem w tej grupie ExecutionGroup i kończy się niepowodzeniem.
- "Trzecia Grupa Wykonywania" zawiera Test5, Test6 i Test7. Test5 wykonuje się i przechodzi pomyślnie, mimo że Test4 z poprzedniej grupy ExecutionGroup nie powiódł się. Test6 jest przeznaczony do niepowodzenia, co spowoduje zablokowanie test7.
- "Czwarta grupa wykonawcza zawiera Test8 i Test9." Po raz kolejny, chociaż Test7 z poprzedniej grupy ExecutionGroup został zablokowany z powodu niepowodzenia Test6, Test8 zostanie wykonany pomyślnie, i tak również będzie Test9.
Aby lepiej zrozumieć ExecutionGroups w tym przykładzie, wyświetlmy listę ich właściwości.
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
Po wykonaniu powyższego testu następujące dane wyjściowe potwierdzają przewidywaną kolejność wykonywania.
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
Zwróć uwagę, że kolejność wykonywania testu jest zgodnie z oczekiwaniami.