Gruppi di esecuzione
Assicurarsi di avere familiarità con l'esecuzione di base di TAEF e sapere come creare test usando questa sezione. È anche possibile esaminare alcuni esempi di test basati sui dati elencati nella Guida utente.
Test basati su scenari con TAEF
Quando si parla di test a livello di scenario, si parla davvero di una serie di test, in cui l'esecuzione del test successivo ha senso solo se il test precedente nello scenario ha avuto esito positivo. In alcuni casi, potrebbe non avere nemmeno tutte le informazioni necessarie per eseguire il test successivo se il test precedente non è riuscito. Verso questo termine, mantenendo l'unità di esecuzione come metodo di test e consentendo scenari di test, TAEF supporta ciò che è noto come "ExecutionGroup". È possibile disporre di test basati su scenari in TAEF indipendentemente dalla presenza di altre funzionalità come i test basati sui dati. Se si progetta lo scenario per sfruttare i test basati sui dati, è possibile applicare il supporto basato sui dati a livello di classe usando le funzionalità della classe basate sui dati offerte da TAEF. Applicando il supporto basato sui dati a livello di classe, è possibile eseguire tutti i test all'interno della classe in sequenza per ogni riga.
Questa pagina si concentra su come specificare una sequenza di test all'interno di una classe come "ExecutionGroup".
Gruppi di esecuzione
Prima di discutere i gruppi di esecuzione, è importante notare e ricordare che in TAEF, l'ordine di esecuzione dei test all'interno di una classe è l'ordine in cui sono stati qualificati come TEST_METHOD (...) nel caso di codice nativo o aggiunto [TestMethod] prima del metodo nel caso di codice gestito. TAEF non garantisce l'ordine di esecuzione delle classi stesse.
Ora, nei test basati su scenari, potrebbe non essere sufficiente solo garantire l'ordine di esecuzione, è anche necessario garantire che tutti i test precedenti nello scenario abbiano esito positivo prima di procedere al test successivo nello scenario. Questo è il luogo in cui si troverà il concetto di "ExecutionGroup" da usare.
Si consideri un esempio nativo:
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 };
Vedere la riga 4 nel frammento di file C++ precedente. In questo caso specifico si qualificano tutti i test all'interno della classe ExecutionDependencyExample per appartenere a un "ExecutionGroup" denominato "DependentTests". Ciò significa che "Test1", "Test2" e "Test3" fanno parte del gruppo di esecuzione "DependentTests". Come accennato in precedenza, Test2 verrà eseguito se e solo se Test1 viene eseguito correttamente e superato. Analogamente Test3 verrà eseguito se e solo se Test2 viene eseguito correttamente e superato.
Si noterà che Test2 è stato progettato per avere esito negativo (vedere le righe 14 e 15 sopra).
Poiché Test2 ha esito negativo nella proprietà "DependentTests" "ExecutionGroup", Test3 non verrà eseguito e verrà invece contrassegnato come bloccato. Consente di provare a eseguire il test precedente e verificare se questo è effettivamente vero.
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
Si noti che, come previsto, Test1 superato, Test2 non riuscito e Test3 è stato bloccato. Con Test3, TAEF registra un messaggio che indica che Test3 appartiene a un gruppo di esecuzione e il test precedente non è stato eseguito correttamente.
Questo messaggio di errore indica anche che tutti i test prima dell'esecuzione del test corrente che appartengono allo stesso Gruppo di esecuzione devono essere selezionati. In altre parole, se si tenta di eseguire solo Test2 usando un criterio di selezione in fase di esecuzione, si vedrà che Test2 verrà bloccato perché dipende dall'esecuzione di Test1, essendo parte dello stesso 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
Se tuttavia si seleziona Test1, ovvero il primo test in ExecutionGroup, verrà eseguito correttamente.
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
Inoltre, se si dispone di test che non appartengono al Gruppo di esecuzione, verranno eseguiti indipendentemente dal risultato dell'esecuzione dei test all'interno del Gruppo di esecuzione che li procede. È anche possibile avere più di un ExecutionGroup all'interno di una classe. Si noti tuttavia che ExecutionGroup non può essere compreso tra le classi. In tal caso, verranno invece considerati come due ExecutionGroup separati, uno in ogni classe.
Il messaggio indica anche che Test3 deve essere eseguito nello stesso ambiente di Test2. Cerchiamo di comprendere questo aspetto in un po'più di dettaglio. Poiché fa parte di un ExecutionGroup significa essere parte del test basato sullo scenario, diventa fondamentale che tutte le richieste di test e quindi vengono eseguite nello stesso ambiente. Ad esempio, se il modello di threading cambia all'interno di un gruppo di esecuzione, verranno visualizzati test bloccati. Se, ad esempio, nell'esempio precedente, Test2 è stato progettato per l'esecuzione correttamente, ma aveva la proprietà 'ThreadingModel' impostata su 'MTA', Test3 sarebbe ancora bloccato.
Si consideri un altro esempio: Esempi\TAEF\CSharp\ExecutionDependentGroupsExample (vedere la condivisione di versione TAEF più recente)
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 }
In questo esempio sono presenti 4 gruppi di esecuzione diversi:
- "First Execution Group" contiene Test1, Test2; entrambi i quali devono passare correttamente.
- "Secondo gruppo di esecuzione" contiene Test3 e Test4. Test4 è l'ultimo test in questo ExecutionGroup e non riesce.
- "Terzo gruppo di esecuzione" contiene Test5, Test6 e Test7. Test5 esegue e passa correttamente anche se Test4 dal precedente ExecutionGroup non è riuscito. Test6 è progettato per l'esito negativo, che causerà il blocco di Test7.
- "Quarto gruppo di esecuzione" contiene Test8 e Test9. Ancora una volta, anche se test7 del gruppo di esecuzione precedente è stato bloccato a causa dell'esito negativo di Test6, Test8 verrà eseguito correttamente e quindi Test9.
Solo per comprendere meglio i Gruppi di esecuzione in questo esempio, vengono elencate le proprietà in questo esempio.
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
Quando si esegue il test precedente, l'output seguente conferma l'ordine di esecuzione previsto.
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
Si noti che l'ordine di esecuzione del test è come previsto.