Partilhar via


Grupos de execução

Verifique se você está familiarizado com a execução básica do TAEF e saiba como criar testes usando-o antes de prosseguir com esta seção. Talvez você também queira passar por um passo a passo de exemplo de teste controlado por dados listado no Guia do Usuário.

Teste baseado em cenário com TAEF

Quando você fala sobre testes em nível de cenário, você está realmente falando sobre uma série de testes, em que a execução do próximo teste só faz sentido se o teste anterior no cenário foi bem-sucedido. Em alguns casos, talvez você nem tenha todas as informações necessárias para executar o próximo teste se o teste anterior falhou. Nesse sentido, mantendo a unidade de execução como um método de teste e permitindo cenários de teste, o TAEF dá suporte ao que são conhecidos como "ExecutionGroup"s. Você pode ter testes baseados em cenários no TAEF, independentemente de ainda ter outros recursos, como testes controlados por dados. Se você criar 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 controlada por dados oferecida pelo TAEF. Ao aplicar o suporte controlado por dados no nível da classe, você pode fazer com que todos os testes em 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 de testes em 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 próprias 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 êxito antes de prosseguir para o próximo teste no cenário. É aqui que você achará que o conceito de "ExecutionGroup" é útil.

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 snippet de arquivo C++ acima. Nesse caso específico, você está qualificando todos os testes dentro da Classe ExecutionDependencyExample para pertencer a um "ExecutionGroup" chamado "DependentTests". Isso significa que "Test1", "Test2" e "Test3" fazem parte do grupo de execução "DependentTests". Conforme mencionado anteriormente, Test2 será executado se e somente se Test1 for executado com êxito e for aprovado. Da mesma forma, Test3 será executado se e somente se Test2 for executado com êxito e for aprovado.

Você verá que Test2 foi projetado para falhar (consulte as linhas 14 e 15 acima).

Como Test2 falha em nosso "DependentTests" "ExecutionGroup", Test3 não será executado e será marcado como bloqueado. Vamos tentar executar o teste acima e ver se isso é realmente verdadeiro.

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, Test1 foi aprovado, Test2 falhou e Test3 foi bloqueado. Com o Test3, o TAEF registra uma mensagem informando que Test3 pertence a um grupo de execução e que o teste anterior não foi executado com êxito.

Essa mensagem de erro também diz que todos os testes antes da execução do teste atual 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 runtime, descobrirá que Test2 será bloqueado, pois a execução depende de Test1, sendo 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, se você tiver testes que não pertencem ao ExecutionGroup, eles serão executados independentemente do resultado de execução dos testes dentro do ExecutionGroup que os procede. Também é possível ter mais de um ExecutionGroup dentro de uma classe. Observe, no entanto, que ExecutionGroup não pode abranger classes. Se você fizer isso, eles serão considerados 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 aspecto 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 for alterado em 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 mais recente do 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    }

Este exemplo tem quatro grupos de execução diferentes:

  • "First Execution Group" contém Test1, Test2; ambos devem passar com êxito.
  • "Segundo Grupo de Execução" contém Test3 e Test4. Test4 é o último teste neste ExecutionGroup e ele falha.
  • "Terceiro Grupo de Execução" contém Test5, Test6 e Test7. Test5 é executado e aprovado com êxito, embora o Test4 do ExecutionGroup anterior tenha falhado. O Test6 foi projetado para falhar, o que fará com que Test7 seja Bloqueado.
  • "Fourth Execution Group" contém Test8 e Test9. Mais uma vez, embora Test7 do ExecutionGroup anterior tenha sido bloqueado devido à falha do Test6, Test8 será executado com êxito, assim como Test9.

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 é conforme o esperado.