Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Убедитесь, что вы знакомы с базовым выполнением TAEF и знаете, как создавать тесты с его помощью, прежде чем продолжить работу с этим разделом. Кроме того, вам может потребоваться пройти некоторый пример тестов на основе данных, приведенный в руководстве пользователя.
тестированиеScenario-Based с помощью 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 с именем "Зависимые тесты". Это означает, что "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 прошел, Test2 завершился сбоем, и Test3 был заблокирован. С помощью Test3 TAEF регистрирует сообщение о том, что Test3 принадлежит группе выполнения, и предыдущий тест не выполнен успешно.
Это сообщение об ошибке также говорит, что все тесты перед выполнением текущего теста, принадлежащие одной группе ExecutionGroup, должны быть выбраны. Другими словами, если вы пытаетесь запустить только Test2 с помощью условий выбора во время выполнения, вы обнаружите, что Test2 будет заблокирован, так как он зависит от test1, являясь частью той же Группы выполнения.
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
Однако если вы выберете Test1, который является первым тестом в 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, по одной в каждом классе.
В сообщении также говорится, что 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 — это последний тест в этой группе выполнения, и он завершается ошибкой.
- "Третья группа выполнения" содержит Test5, Test6 и Test7. Test5 выполняется и успешно проходит, хотя test4 из предыдущей группы выполнения завершилось сбоем. Test6 предназначен для сбоя, что приведет к блокировке Test7.
- "Группа выполнения номер четыре" содержит Test8 и Test9. Хотя Test7 из предыдущей группы выполнения был заблокирован из-за сбоя Test6, Test8 будет выполнен успешно, и Test9 также будет выполнен успешно.
Чтобы лучше понять группы выполнения в этом примере, давайте перечислим свойства в этом примере.
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
Обратите внимание, что порядок выполнения теста соответствует ожидаемому.