Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Por favor, certifique-se de que você está familiarizado com a execução básica do TAEF e sabe como criar testes usando-o, antes de prosseguir com esta seção. Você também pode querer passar por alguns exemplos de teste orientado por dados listados no Guia do Usuário.
Scenario-Based Testes com TAEF
Quando você fala sobre testes no nível do cenário, você está realmente falando sobre uma série de testes, onde a execução do próximo teste só faz sentido se o teste anterior no cenário tiver sido bem-sucedido. Em alguns casos, você pode nem mesmo ter todas as informações necessárias para executar o próximo teste se o teste anterior falhar. Para este fim, mantendo a unidade de execução como um método de teste e permitindo cenários de teste, o TAEF suporta o que são conhecidos como "ExecutionGroup". Você pode ter testes baseados em cenários no TAEF independentemente de ainda ter outros recursos, como testes orientados por dados. Se você projetar seu cenário para aproveitar os testes controlados por dados, poderá aplicar o suporte controlado por dados no nível da classe usando a funcionalidade de classe orientada por dados oferecida pelo TAEF. Ao aplicar o suporte orientado por dados no nível da classe, você pode fazer com que todos os testes dentro da sua classe sejam executados sequencialmente para cada linha.
Esta página se concentrará em como especificar uma sequência de testes dentro de uma classe como um "ExecutionGroup".
Grupos de Execução
Antes de discutir Grupos de Execução, é importante observar e lembrar que , no TAEF, a ordem de execução dos testes dentro de uma classe é a ordem na qual você os qualificou como um TEST_METHOD(...) no caso de código nativo, ou adicionou a propriedade [TestMethod] antes do método no caso de código gerenciado. O TAEF não garante a ordem de execução das classes.
Agora, em testes baseados em cenário, pode não ser suficiente apenas garantir a ordem de execução, você também precisa garantir que todos os testes anteriores no cenário tenham sido bem-sucedidos antes de prosseguir para o próximo teste no cenário. É aqui que vais achar útil o conceito de "ExecutionGroup".
Considere um exemplo 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 };
Consulte a linha 4 no trecho de arquivo C++ acima. Neste caso específico, está-se a qualificar todos os testes dentro da classe ExecutionDependencyExample como pertencentes a um "ExecutionGroup" chamado "DependentTests". Isso significa que "Test1", "Test2" e "Test3" fazem parte do grupo de execução "DependentTests". Como mencionado anteriormente, o Test2 será executado se e somente se o Test1 for executado com sucesso e passar nos testes. Da mesma forma, o Test3 será executado apenas se o Test2 for executado com sucesso e passar.
Você verá que o Test2 foi projetado para falhar (veja as linhas 14 e 15 acima).
Como o Test2 falha em nosso "DependentTests" "ExecutionGroup", o Test3 não será executado e, em vez disso, será marcado como bloqueado. Vamos tentar executar o teste acima e ver se isso é realmente verdade.
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
Observe que, como previsto, o Test1 passou, o Test2 falhou e o Test3 foi bloqueado. Com Test3, TAEF registra uma mensagem dizendo que Test3 pertence a um grupo de execução e o teste anterior não foi executado com êxito.
Essa mensagem de erro também diz que todos os testes antes do teste atual que está sendo executado que pertencem ao mesmo ExecutionGroup devem ser selecionados. Em outras palavras, se você tentar executar apenas Test2 usando um critério de seleção em tempo de execução, você descobrirá que Test2 será bloqueado, pois é execução dependente de Test1, fazendo parte do mesmo 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
No entanto, se você selecionar Test1, que é o primeiro teste no ExecutionGroup, ele será executado com êxito.
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
Além disso, no caso de testes que não pertencem ao ExecutionGroup, serão executados independentemente do resultado da execução dos testes dentro do ExecutionGroup que os precedem. Também é possível ter mais de um ExecutionGroup dentro de uma classe. No entanto, observe que ExecutionGroup não pode se estender entre classes. Caso faça isso, eles serão tratados como dois ExecutionGroups separados, um em cada classe.
A mensagem também diz que Test3 deve ser executado no mesmo ambiente que Test2. Vamos tentar entender esse aspeto com um pouco mais de detalhes. Como fazer parte de um ExecutionGroup realmente significa fazer parte do teste baseado em cenário, torna-se crucial que todos os testes solicitem e, portanto, sejam executados no mesmo ambiente. Por exemplo, se o Modelo de Threading mudar dentro de um ExecutionGroup, você verá testes bloqueados. Se, por exemplo, no exemplo acima, Test2 foi projetado para ser executado com êxito, mas tinha a propriedade 'ThreadingModel' definida como 'MTA', Test3 ainda seria bloqueado.
Vamos considerar outro exemplo: Examples\TAEF\CSharp\ExecutionDependentGroupsExample (consulte o compartilhamento de versão TAEF mais 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 }
Este exemplo tem 4 grupos de execução diferentes:
- "First Execution Group" contém Test1, Test2; ambos devem passar com sucesso.
- "Segundo Grupo de Execução" contém Test3 e Test4. Test4 é o último teste neste ExecutionGroup e falha.
- "Third Execution Group" contém Test5, Test6 e Test7. Test5 executa e passa com êxito, embora Test4 do ExecutionGroup anterior falhou. Test6 é projetado para falhar, o que fará com que Test7 seja bloqueado.
- "Quarto Grupo de Execução" contém Test8 e Test9. Mais uma vez, o Test7 do grupo de execução anterior foi bloqueado devido à falha do Test6, o Test8 será executado com sucesso e o Test9 também.
Apenas para entender melhor os ExecutionGroups neste exemplo, vamos listar as propriedades neste exemplo.
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 você executa o teste acima, a saída a seguir confirma a ordem de execução prevista.
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
Observe que a ordem de execução do teste está conforme o esperado.