Bagikan melalui


Grup Eksekusi

Pastikan Anda terbiasa dengan eksekusi dasar TAEF dan tahu cara Menulis Pengujian menggunakannya, sebelum melanjutkan bagian ini. Anda mungkin juga ingin melalui beberapa panduan contoh pengujian berbasis data yang tercantum dalam Panduan Pengguna.

Pengujian Berbasis Skenario dengan TAEF

Ketika Anda berbicara tentang pengujian tingkat skenario, Anda benar-benar berbicara tentang serangkaian pengujian, di mana menjalankan pengujian berikutnya masuk akal hanya jika pengujian sebelumnya dalam skenario berhasil. Dalam beberapa kasus, Anda bahkan mungkin tidak memiliki semua informasi yang Anda butuhkan untuk menjalankan pengujian berikutnya jika pengujian sebelumnya gagal. Menuju akhir ini, sambil menjaga unit eksekusi sebagai metode pengujian dan memungkinkan skenario pengujian, TAEF mendukung apa yang dikenal sebagai "ExecutionGroup"s. Anda dapat memiliki pengujian berbasis skenario di TAEF terlepas dari fitur lain seperti pengujian berbasis data. Jika Anda merancang skenario untuk memanfaatkan pengujian berbasis data, Anda dapat menerapkan dukungan berbasis data di tingkat kelas menggunakan fungsionalitas kelas berbasis Data yang ditawarkan oleh TAEF. Dengan menerapkan dukungan berbasis data di tingkat kelas, Anda dapat memiliki semua pengujian dalam kelas Anda dijalankan secara berurutan untuk setiap baris.

Halaman ini akan berkonsentrasi pada cara menentukan urutan pengujian dalam kelas sebagai "ExecutionGroup".

Grup Eksekusi

Sebelum membahas Grup Eksekusi, penting untuk dicatat dan diingat bahwa dalam TAEF, urutan eksekusi pengujian dalam kelas adalah urutan di mana Anda telah memenuhi syarat sebagai TEST_METHOD(...) dalam kasus kode asli, atau menambahkan properti [TestMethod] sebelum metode jika terjadi kode terkelola. TAEF tidak menjamin urutan eksekusi kelas itu sendiri.

Sekarang, dalam pengujian berbasis skenario, mungkin tidak cukup untuk hanya menjamin urutan eksekusi, Anda juga perlu menjamin bahwa semua pengujian sebelumnya dalam skenario berhasil sebelum Anda melanjutkan ke pengujian berikutnya dalam skenario. Di sinilah Anda akan menemukan konsep "ExecutionGroup" agar berguna.

Pertimbangkan contoh asli:

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

Lihat baris 4 dalam cuplikan file C++ di atas. Dalam kasus khusus ini, Anda memenuhi syarat semua pengujian dalam Class ExecutionDependencyExample milik "ExecutionGroup" yang disebut "DependentTests". Ini berarti bahwa "Test1", "Test2", dan "Test3" adalah bagian dari grup eksekusi "DependentTests". Seperti disebutkan sebelumnya, Test2 akan dieksekusi jika dan hanya jika Test1 berhasil dijalankan dan lulus. Demikian pula Test3 akan dieksekusi jika dan hanya jika Test2 berhasil dijalankan dan lulus.

Anda akan melihat bahwa Test2 telah dirancang untuk gagal (lihat baris 14 dan 15 di atas).

Karena Test2 gagal dalam "DependentTests" "ExecutionGroup" kami, Test3 tidak akan dieksekusi dan sebaliknya akan ditandai sebagai diblokir. Mari kita coba menjalankan tes di atas dan melihat apakah ini memang benar.

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

Perhatikan bahwa, seperti yang diprediksi, Test1 lulus, Test2 gagal, dan Test3 diblokir. Dengan Test3, TAEF mencatat pesan yang mengatakan bahwa Test3 milik grup eksekusi dan pengujian sebelumnya tidak berhasil dijalankan.

Pesan kesalahan ini juga mengatakan bahwa semua pengujian sebelum pengujian saat ini dijalankan yang termasuk dalam ExecutionGroup yang sama harus dipilih. Dengan kata lain, jika Anda hanya mencoba menjalankan Test2 menggunakan kriteria pilihan pada runtime, Anda akan menemukan bahwa Test2 akan diblokir karena eksekusi tergantung pada Test1, menjadi bagian dari ExecutionGroup yang sama.

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

Namun, jika Anda memilih Test1, yang merupakan pengujian pertama di ExecutionGroup, itu akan berjalan dengan sukses.

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

Selain itu, jika Anda memiliki tes yang bukan milik ExecutionGroup, tes tersebut akan dieksekusi terlepas dari hasil eksekusi pengujian dalam ExecutionGroup yang melanjutkannya. Dimungkinkan juga untuk memiliki lebih dari satu ExecutionGroup dalam kelas . Namun perhatikan bahwa ExecutionGroup tidak dapat menjangkau seluruh Kelas. Jika Anda melakukannya, mereka akan dianggap sebagai dua ExecutionGroup terpisah, satu di setiap kelas.

Pesan juga mengatakan bahwa Test3 harus dijalankan di lingkungan yang sama dengan Test2. Mari kita coba memahami aspek ini secara sedikit lebih rinci. Karena menjadi bagian dari ExecutionGroup benar-benar berarti menjadi bagian dari pengujian berbasis skenario, menjadi sangat penting bahwa semua permintaan pengujian dan karenanya dijalankan di lingkungan yang sama. Misalnya, jika Model Threading berubah dalam ExecutionGroup, Anda akan melihat pengujian yang diblokir. Jika misalnya, dalam contoh di atas, Test2 dirancang untuk berhasil dijalankan, tetapi properti 'ThreadingModel' diatur ke 'MTA', Test3 masih akan diblokir.

Mari kita pertimbangkan contoh lain: Examples\TAEF\CSharp\ExecutionDependentGroupsExample (silakan lihat berbagi rilis TAEF terbaru)

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    }

Contoh ini memiliki 4 grup eksekusi yang berbeda:

  • "Grup Eksekusi Pertama" berisi Test1, Test2; keduanya harus berhasil lolos.
  • "Grup Eksekusi Kedua" berisi Test3 dan Test4. Test4 adalah pengujian terakhir dalam ExecutionGroup ini dan gagal.
  • "Grup Eksekusi Ketiga" berisi Test5, Test6, dan Test7. Test5 berhasil dijalankan dan berhasil meskipun Test4 dari ExecutionGroup sebelumnya gagal. Test6 dirancang untuk gagal, yang akan menyebabkan Test7 diblokir.
  • "Grup Eksekusi Keempat" berisi Test8 dan Test9. Sekali lagi, meskipun Test7 dari ExecutionGroup sebelumnya diblokir karena Pengujian6 gagal, Test8 akan berhasil dijalankan dan begitu juga Test9.

Hanya untuk memahami ExecutionGroups dalam contoh ini dengan lebih baik, mari kita cantumkan properti dalam contoh ini.

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

Saat Anda menjalankan pengujian di atas, output berikut mengonfirmasi urutan eksekusi yang diprediksi.

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

Perhatikan bahwa urutan eksekusi pengujian seperti yang diharapkan.