Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Než budete pokračovat v této části, ujistěte se, že znáte základní provádění TAEF a víte, jak používat k vytváření testů. Můžete si také projít některé ukázky testů řízené daty uvedené v uživatelské příručce.
testováníScenario-Based pomocí TAEF
Když mluvíte o testování na úrovni scénáře, opravdu mluvíte o řadě testů, kde provádění dalšího testu dává smysl pouze v případě, že předchozí test ve scénáři proběhl úspěšně. V některých případech nemusíte mít ani všechny informace, které potřebujete k provedení dalšího testu, pokud předchozí test selhal. TAEF podporuje takzvané "ExecutionGroup", aby bylo možné zachovat jednotku provádění jako testovací metodu a umožnit testovací scénáře. Testy založené na scénářích v taEF můžete mít bez ohledu na to, že máte i další funkce, jako je testování řízené daty. Pokud navrhujete svůj scénář tak, aby využíval testování řízené daty, můžete použít podporu řízenou daty na úrovni třídy pomocí funkcí třídy řízených daty, které nabízí TAEF. Použitím podpory řízené daty na úrovni třídy můžete mít všechny testy v rámci třídy spouštěné postupně pro každý řádek.
Tato stránka se zaměří na to, jak určit posloupnost testů v rámci třídy jako ExecutionGroup.
Skupiny exekuce
Než začnete diskutovat o skupinách provádění, je důležité si uvědomit a pamatovat si , že pořadí provádění testů v rámci třídy je pořadí, ve kterém jste je kvalifikovali jako TEST_METHOD(...) v případě nativního kódu nebo přidali vlastnost [TestMethod] před metodu v případě spravovaného kódu. TAEF nezaručuje samotné pořadí provádění tříd.
V testech založených na scénářích teď nemusí být dostatečné pouze zaručit pořadí provádění, musíte také zaručit, že všechny předchozí testy ve scénáři proběhly úspěšně, než v tomto scénáři přejdete k dalšímu testu. Tady najdete koncept "ExecutionGroup", který je užitečný.
Představte si nativní příklad:
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 };
Viz řádek 4 ve výše uvedeném fragmentu souboru C++. V tomto konkrétním případě zařazujete všechny testy v rámci třídy ExecutionDependencyExample do skupiny "ExecutionGroup" s názvem "DependentTests". To znamená, že "Test1", "Test2" a "Test3" jsou součástí vykonávací skupiny "DependentTests". Jak už bylo zmíněno dříve, test2 se spustí, pokud se test1 úspěšně spustí a projde. Podobně se test3 spustí, pokud se test2 úspěšně spustí a projde.
Uvidíte, že test2 byl navržen tak, aby selhal (viz řádky 14 a 15 výše).
Vzhledem k tomu, že test2 selže v naší "DependentTests" "ExecutionGroup", test3 se nespustí a místo toho bude označen jako blokovaný. Pojďme zkusit spustit výše uvedený test a zjistit, jestli je to skutečně pravda.
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
Všimněte si, že podle předpovědi byl test1 úspěšný, test2 selhal a test3 byl zablokovaný. S Test3 TAEF zaznamená zprávu, že Test3 patří do skupiny provádění a předchozí test nebyl úspěšně proveden.
Tato chybová zpráva také říká, že všechny testy před spuštěním aktuálního testu, který patří do stejné skupiny ExecutionGroup, by měly být vybrány. Jinými slovy, pokud se pokusíte spustit pouze Test2 pomocí kritérií výběru za běhu, zjistíte, že Test2 bude blokován, protože je spouštění závislé na test1, přičemž je součástí stejné skupiny 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
Pokud však vyberete Test1, což je první test v executionGroup, spustí se úspěšně.
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
Pokud máte také testy, které nepatří do skupiny ExecutionGroup, spustí se bez ohledu na výsledek spuštění testů v rámci skupiny ExecutionGroup, která je pokračuje. V rámci třídy je také možné mít více než jednu skupinu ExecutionGroup. Všimněte si však, že ExecutionGroup nemůže překlenovat mezi třídami. Pokud to uděláte, budou místo toho považovány za dvě samostatné skupiny ExecutionGroup, jednu v každé třídě.
Zpráva také říká, že test3 by měl být spuštěn ve stejném prostředí jako Test2. Pojďme se pokusit porozumět tomuto aspektu trochu podrobněji. Vzhledem k tomu, že být součástí ExecutionGroup opravdu znamená být součástí testu založeného na scénáři, je klíčové, aby všechny testy požadovaly a tedy byly prováděny ve stejném prostředí. Pokud se například model vláken změní v rámci skupiny ExecutionGroup, zobrazí se blokované testy. Pokud například v předchozím příkladu byl Test2 navržen tak, aby se úspěšně spustil, ale měl vlastnost ThreadingModel nastavenou na MTA, Test3 by stále byl blokovaný.
Podívejme se na další příklad: Examples\TAEF\CSharp\ExecutionDependentGroupsExample (podívejte se na poslední verzi 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 }
Tento příklad obsahuje 4 různé skupiny provádění:
- "První spouštěcí skupina" obsahuje Test1, Test2; oba by měly uspět úspěšně.
- Druhý blok spuštění obsahuje Test3 a Test4. Test4 je posledním testem v této skupině ExecutionGroup a selže.
- Třetí prováděcí skupina obsahuje Test5, Test6 a Test7. Test5 se úspěšně spustí a úspěšně projde, i když test4 z předchozí skupiny ExecutionGroup selhal. Test6 je navržený tak, aby selhal, což způsobí, že test7 bude blokovaný.
- Čtvrtá skupina provádění obsahuje Test8 a Test9. "Znovu, i když byl Test7 z předchozí skupiny ExecutionGroup zablokovaný kvůli selhání Test6, Test8 se úspěšně spustí a také Test9."
Abychom lépe porozuměli executionGroups v tomto příkladu, pojďme v tomto příkladu zobrazit seznam vlastností.
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
Když provedete výše uvedený test, následující výstup potvrdí předpovězené pořadí spuštění.
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
Všimněte si, že pořadí provádění testů je podle očekávání.