Поделиться через


Группы выполнения

Прежде чем переходить к этому разделу, убедитесь, что вы знакомы с базовым выполнением TAEF и знаете, как создавать тесты с его помощью. Вы также можете просмотреть некоторые примеры тестов на основе данных, перечисленные в руководстве пользователя.

Тестирование на основе сценариев с помощью TAEF

Когда вы говорите о тестировании на уровне сценария, вы действительно имеете в виду серию тестов, где выполнение следующего теста имеет смысл только в том случае, если предыдущий тест в сценарии был успешным. В некоторых случаях у вас может даже не быть всей информации, необходимой для выполнения следующего теста, если предыдущий тест завершился неудачно. С этой целью, сохраняя единицу выполнения в качестве метода тестирования и позволяя тестировать сценарии, TAEF поддерживает так называемые "ExecutionGroup". Вы можете использовать тесты на основе сценариев в TAEF независимо от того, есть и другие функции, такие как тестирование на основе данных. Если вы разрабатываете сценарий для использования управляемого данными тестирования, вы можете применить поддержку на уровне класса с помощью функций класса на основе данных, предлагаемых TAEF. Применяя поддержку на основе данных на уровне класса, вы можете последовательно выполнять все тесты в классе для каждой строки.

На этой странице основное внимание уделяется указанию последовательности тестов в классе как ExecutionGroup.

Группы выполнения

Прежде чем обсуждать группы выполнения, важно отметить и помнить , что в TAEF порядок выполнения тестов в классе — это порядок, в котором вы квалифицировали их как TEST_METHOD(...) в случае машинного кода или добавили свойство [TestMethod] перед методом в случае управляемого кода. TAEF не гарантирует порядок выполнения самих классов.

Теперь в тестах на основе сценария может быть недостаточно просто гарантировать порядок выполнения. Кроме того, необходимо гарантировать, что все предыдущие тесты в сценарии были успешно выполнены, прежде чем переходить к следующему тесту в сценарии. Здесь вы найдете концепцию ExecutionGroup, чтобы быть полезной.

Рассмотрим собственный пример:

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    };

См. строку 4 в приведенном выше фрагменте файла C++. В этом конкретном случае вы квалифицируете все тесты в классе ExecutionDependencyExample, чтобы они принадлежали к группе ExecutionGroup с именем DependentTests. Это означает, что "Test1", "Test2" и "Test3" входят в группу выполнения "DependentTests". Как упоминалось ранее, Test2 будет выполняться только в том случае, если test1 успешно выполняется и проходит успешно. Аналогичным образом Test3 будет выполняться только в том случае, если test2 успешно выполняется и проходит проверку.

Вы увидите, что test2 был разработан для сбоя (см. строки 14 и 15 выше).

Так как Test2 завершается сбоем в группе "Зависимые тесты" "ExecutionGroup", test3 не будет выполнен и будет помечен как заблокированный. Давайте попробуем выполнить приведенный выше тест и проверить, действительно ли это так.

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

Обратите внимание, что, как и было спрогнозировано, тест Test1 прошел сбой, а Test3 был заблокирован. При использовании Test3 TAEF регистрирует сообщение о том, что Test3 принадлежит к группе выполнения и предыдущий тест не выполнен успешно.

Это сообщение об ошибке также указывает, что должны быть выбраны все тесты до выполнения текущего теста, принадлежащие одной группе ExecutionGroup. Другими словами, если вы попытаетесь запустить только Test2, используя критерии выбора во время выполнения, вы обнаружите, что Test2 будет заблокирован, так как он зависит от Test1, являясь частью той же группы 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

Если же выбрать Тест1, который является первым тестом в ExecutionGroup, он будет успешно выполнен.

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

Кроме того, если у вас есть тесты, которые не относятся к ExecutionGroup, они будут выполняться независимо от результата выполнения тестов в группе ExecutionGroup, выполняющей их. Кроме того, в классе может быть несколько групп ExecutionGroup. Обратите внимание, что ExecutionGroup не может охватывать несколько классов. В этом случае они будут рассматриваться как две отдельные группы ExecutionGroup, по одной в каждом классе.

В сообщении также говорится, что Test3 должен выполняться в той же среде, что и Test2. Давайте попробуем понять этот аспект немного подробнее. Поскольку быть частью ExecutionGroup на самом деле означает быть частью теста на основе сценария, очень важно, чтобы все тесты запрашивали и, следовательно, выполнялись в одной среде. Например, если потоковая модель изменяется в Группе ExecutionGroup, вы увидите заблокированные тесты. Если, например, в приведенном выше примере Test2 был разработан для успешного выполнения, но для свойства ThreadingModel было задано значение MTA, Test3 по-прежнему будет заблокирован.

Рассмотрим еще один пример: Examples\TAEF\CSharp\ExecutionDependentGroupsExample (см. последнюю общую папку выпуска 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    }

В этом примере имеется 4 различные группы выполнения:

  • "Первая группа выполнения" содержит Test1, Test2; оба из которых должны успешно пройти.
  • Вторая группа выполнения содержит test3 и Test4. Test4 является последним тестом в этой группе ExecutionGroup, и он завершается сбоем.
  • "Третья группа выполнения" содержит Test5, Test6 и Test7. Test5 выполняется и проходит успешно, хотя test4 из предыдущей группы ExecutionGroup завершился ошибкой. Тест 6 предназначен для сбоя, что приведет к блокировке Test7.
  • "Четвертая группа выполнения" содержит test8 и Test9. Опять же, несмотря на то, что test7 из предыдущей группы ExecutionGroup был заблокирован из-за сбоя Test6, Test8 будет успешно выполняться, а также Test9.

Чтобы лучше понять ExecutionGroups в этом примере, давайте перечислим свойства в этом примере.

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

При выполнении приведенного выше теста следующие выходные данные подтверждают прогнозируемый порядок выполнения.

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

Обратите внимание, что порядок выполнения теста соответствует ожидаемому.