Compartir a través de


Grupos de ejecución

Asegúrese de que está familiarizado con la ejecución básica de TAEF y sabe cómo crear pruebas con ella antes de continuar con esta sección. Es posible que también quiera seguir algunos tutoriales de ejemplo de prueba controlada por datos que se enumeran en la Guía del usuario.

Pruebas basadas en escenarios con TAEF

Cuando se habla de pruebas de nivel de escenario, realmente se habla de una serie de pruebas, donde la ejecución de la siguiente prueba tiene sentido solo si la prueba anterior en el escenario se realizó correctamente. En algunos casos, es posible que ni siquiera tenga toda la información necesaria para ejecutar la siguiente prueba si se produjo un error en la prueba anterior. Hacia este fin, al tiempo que mantiene la unidad de ejecución como un método de prueba y permite escenarios de prueba, TAEF admite lo que se conoce como "ExecutionGroup". Puede tener pruebas basadas en escenarios en TAEF, independientemente de si sigue teniendo otras características como las pruebas controladas por datos. Si diseña su escenario para aprovechar las pruebas controladas por datos, puede aplicar compatibilidad controlada por datos en el nivel de clase mediante la funcionalidad de clase controlada por datos que ofrece TAEF. Al aplicar la compatibilidad controlada por datos en el nivel de clase, puede hacer que todas las pruebas de la clase se ejecuten secuencialmente para cada fila.

Esta página se centrará en cómo especificar una secuencia de pruebas dentro de una clase como "ExecutionGroup".

Grupos de ejecución

Antes de analizar los grupos de ejecución, es importante tener en cuenta y recordar que en TAEF, el orden de ejecución de las pruebas dentro de una clase es el orden en el que los ha calificado como un TEST_METHOD(...) en caso de código nativo o se ha agregado la propiedad [TestMethod] antes del método en caso de código administrado. TAEF no garantiza el orden de ejecución de clases.

Ahora, en las pruebas basadas en escenarios, es posible que no sea suficiente simplemente garantizar el orden de ejecución, también debe garantizar que todas las pruebas anteriores del escenario se realizaron correctamente antes de continuar con la siguiente prueba en el escenario. Aquí es donde encontrará el concepto de "ExecutionGroup" para ser útil.

Considere un ejemplo 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 la línea 4 en el fragmento de código de archivo de C++ anterior. En este caso concreto, está calificando todas las pruebas dentro de Class ExecutionDependencyExample para pertenecer a un "ExecutionGroup" denominado "DependentTests". Esto significa que "Test1", "Test2" y "Test3" forman parte del grupo de ejecución "DependentTests". Como se mencionó anteriormente, Test2 se ejecutará si y solo si Test1 se ejecuta correctamente y pasa. De forma similar, Test3 se ejecutará si y solo si Test2 se ejecuta correctamente y pasa.

Verá que Test2 se ha diseñado para producir un error (vea las líneas 14 y 15 anteriores).

Dado que Se produce un error en Test2 en "DependentTests" "ExecutionGroup", Test3 no se ejecutará y, en su lugar, se marcará como bloqueado. Vamos a intentar ejecutar la prueba anterior y ver si esto es cierto.

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

Tenga en cuenta que, como se predijo, Se superó Test1, Se produjo un error en Test2 y Se bloqueó Test3. Con Test3, TAEF registra un mensaje que indica que Test3 pertenece a un grupo de ejecución y la prueba anterior no se ejecutó correctamente.

Este mensaje de error también indica que se deben seleccionar todas las pruebas antes de que se ejecute la prueba actual que pertenecen al mismo ExecutionGroup. En otras palabras, si intenta ejecutar solo Test2 mediante un criterio de selección en tiempo de ejecución, verá que Test2 se bloqueará, ya que depende de la ejecución de Test1, siendo parte del mismo 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

Sin embargo, si selecciona Test1, que es la primera prueba en ExecutionGroup, se ejecutará correctamente.

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

Además, si tiene pruebas que no pertenecen al executionGroup, se ejecutarán independientemente del resultado de la ejecución de las pruebas dentro del grupo de ejecución. También es posible tener más de un ExecutionGroup dentro de una clase . Tenga en cuenta que ExecutionGroup no puede abarcar clases. Si lo hace, en su lugar se considerarán como dos Grupos de ejecución independientes, uno en cada clase.

El mensaje también indica que Test3 debe ejecutarse en el mismo entorno que Test2. Vamos a intentar comprender este aspecto con un poco más de detalle. Puesto que ser parte de executionGroup significa ser parte de la prueba basada en escenarios, es fundamental que todas las pruebas soliciten y, por tanto, se ejecuten en el mismo entorno. Por ejemplo, si el modelo de subprocesos cambia dentro de executionGroup, verá pruebas bloqueadas. Si, por ejemplo, en el ejemplo anterior, Test2 se diseñó para ejecutarse correctamente, pero tenía la propiedad "ThreadingModel" establecida en "MTA", Test3 todavía se bloquearía.

Veamos otro ejemplo: Examples\TAEF\CSharp\ExecutionDependentGroupsExample (consulte el último recurso compartido de versión de 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 ejemplo tiene 4 grupos de ejecución diferentes:

  • "Primer grupo de ejecución" contiene Test1, Test2; ambos deben pasar correctamente.
  • "Second Execution Group" contiene Test3 y Test4. Test4 es la última prueba de executionGroup y se produce un error.
  • "Tercer grupo de ejecución" contiene Test5, Test6 y Test7. Test5 se ejecuta y se supera correctamente aunque se produjo un error en Test4 del grupo de ejecución anterior. Test6 está diseñado para producir un error, lo que hará que Test7 se bloquee.
  • "Cuarto grupo de ejecución" contiene Test8 y Test9. Una vez más, aunque test7 del grupo de ejecución anterior se bloqueó debido a un error de Test6, Test8 se ejecutará correctamente y, por tanto, test9.

Solo para comprender mejor executionGroups en este ejemplo, vamos a enumerar las propiedades de este ejemplo.

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

Al ejecutar la prueba anterior, la siguiente salida confirma el orden de ejecución 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

Observe que el orden de ejecución de la prueba es el esperado.