執行群組
請先確定您已熟悉 TAEF 的基本執行,並瞭解如何使用它 撰寫測試 ,再繼續進行本節。 您可能也想要流覽使用者指南中列出的一些資料驅動測試範例逐步解說。
使用 TAEF 進行案例型測試
當您討論案例層級測試時,您實際上是討論一系列測試,只有在案例中的上一個測試成功時,執行下一個測試才有意義。 在某些情況下,如果先前的測試失敗,您可能甚至沒有執行下一個測試所需的所有資訊。 在這一端,將執行單位保留為測試方法,並允許測試案例,TAEF 支援所謂的「ExecutionGroup」。 不論資料驅動測試等其他功能,您都可以在 TAEF 中設定案例型測試。 如果您將案例設計為利用資料驅動測試,您可以使用 TAEF 所提供的資料驅動類別功能,在類別層級套用資料驅動支援。 藉由在類別層級套用資料驅動支援,您可以針對每個資料列循序執行類別內的所有測試。
此頁面將著重于如何將類別內的測試序列指定為 「ExecutionGroup」。
執行群組
在討論執行群組之前,請務必注意並記住 ,在 TAEF 中,類別內測試的執行順序是您在原生程式碼的情況下將其限定為TEST_METHOD (...) 的順序,或在方法發生 Managed 程式碼之前新增 [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 };
請參閱上述 C++ 檔案程式碼片段中的第 4 行。 在此特定案例中,您會限定類別 ExecutionDependencyExample 內的所有測試,以屬於名為 「DependentTests」 的 「ExecutionGroup」。 這表示 「Test1」、「Test2」 和 「Test3」 是 「DependentTests」 執行群組的一部分。 如先前所述,只有在 Test1 成功執行並通過時,Test2 才會執行。 同樣地,只有在 Test2 成功執行並通過時,Test3 才會執行。
您會看到 Test2 已設計為失敗, (看到上述第 14 行和第 15 行) 。
由於 Test2 在 「DependentTests」 「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 相依時遭到封鎖,因為 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
不過,如果您選取 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 無法跨越類別。 如果您這樣做,它們會改為視為兩個不同的 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 會執行並成功通過,但先前 ExecutionGroup 中的 Test4 失敗。 Test6 的設計目的是要失敗,這會導致 Test7 遭到封鎖。
- 「第四個執行群組」包含 Test8 和 Test9。 同樣地,雖然先前 ExecutionGroup 中的 Test7 因為 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
請注意,測試執行順序如預期般。