Kelas berbasis data
Pastikan Anda terbiasa dengan eksekusi dasar TAEF dan tahu cara menulis pengujian menggunakannya sebelum melanjutkan bagian ini. Anda mungkin juga ingin melalui contoh pengujian sederhana berbasis data panduan. Di bagian ini, Anda akan membuat kelas pengujian berbasis data yang didasarkan pada pengujian berbasis data berbasis tabel , tetapi pendekatan yang sama berlaku untuk pengujian berbasis WMI atau berbasis PICT .
Kapan menggunakan Kelas Berbasis Data?
Ada kalanya beberapa pengujian dapat bergantung pada data input yang sama. Saat menguji API, Anda mungkin ingin menjalankan beberapa pengujian API dengan data yang sama untuk mendapatkan tampilan perilaku API yang konsisten. Saat melakukan pengujian tingkat skenario, Anda mungkin ingin memastikan bahwa semua langkah dalam skenario Anda diuji dengan data yang sama. Pada saat-saat ini, berguna untuk menentukan data pengujian di tingkat kelas.
Penulisan Kelas Berbasis Data
Anda menentukan bahwa kelas tertentu digerakkan oleh data dengan cara yang sama seperti cara Anda menentukan bahwa pengujian tertentu digerakkan oleh data. Anda menerapkan metadata DataSource di tingkat kelas. Nilai mengidentifikasi sumber data tertentu yang menarik. Contoh berikut menunjukkan cara menentukan properti ini untuk kelas berbasis data:
Kode asli
1 class 2 {
2 BEGIN_TEST_CLASS(DataDrivenClassExample)
3 TEST_CLASS_PROPERTY(L"DataSource", L"Table:DataDrivenClassExample.xml#ClassTable")
4 END_TEST_CLASS()
5
6 TEST_METHOD(Test1);
7 {
8 int size;
9 if (SUCCEEDED(<span class="style2">TestData::TryGetValue(L"size", size)</span>))
10 {
11 VERIFY_ARE_NOT_EQUAL(size, 0);
12 Log::Comment(String().Format(L"Size retrieved was %d", size));
13 }
14
15 String color;
16 if (SUCCEEDED(<span class="style2">TestData::TryGetValue(L"color", color)</span>))
17 {
18 Log::Comment(L"Color retrieved was " + color);
19 }
20 }
21 TEST_METHOD(Test2);
22 {
23 int size;
24 if (SUCCEEDED(<span class="style2">TestData::TryGetValue(L"size", size)</span>))
25 {
26 VERIFY_ARE_NOT_EQUAL(size, 0);
27 Log::Comment(String().Format(L"Size retrieved was %d", size));
28 }
29
30 String color;
31 if (SUCCEEDED(<span class="style2">TestData::TryGetValue(L"color", color)</span>))
32 {
33 Log::Comment(L"Color retrieved was " + color);
34 }
35 }
36 };
Kode terkelola
1 [TestClass]
2 public class CSharpDataDrivenClassExample
3 {
4 [ClassInitialize]
5 [DataSource("Table:CSharpDataDrivenClassExample.xml#ClassTable")]
6 public static void MyClassInitialize(Object testContext)
7 {
8 }
9
10 [TestMethod]
11 public void Test1()
12 {
13 int size = (int)m_testContext.DataRow["Size"];
14 Verify.AreNotEqual(size, 0);
15 Log.Comment("Size is " + size.ToString());
16
18 Log.Comment("Color is " + m_testContext.DataRow["Color"]);
19 }
20
21 [TestMethod]
22 public void Test2()
23 {
24 int size = (int)m_testContext.DataRow["Size"];
25 Verify.AreNotEqual(size, 0);
26 Log.Comment("Size is " + size.ToString());
27
28 Log.Comment("Color is " + m_testContext.DataRow["Color"]);
29 }
30
31 public TestContext TestContext
32 {
33 get { return m_testContext; }
34 set { m_testContext = value; }
35 }
36
37 private TestContext m_testContext;
38 }
Dalam contoh ini, baris 3 dalam contoh kode Asli dan baris 5 dalam contoh Kode terkelola adalah cara yang disarankan untuk menentukan sumber data untuk kelas pengujian berbasis data di TAEF.
Dalam contoh Kode terkelola di atas, baris 13, 18, 24, dan 28 menunjukkan bagaimana data tersedia untuk metode pengujian untuk kode terkelola.
Dalam contoh kode berikut, baris 4, 11, 20, dan 27 menunjukkan bagaimana data tersedia untuk metode pengujian untuk kode asli. Perhatikan bahwa Anda membuat data yang Anda tentukan dalam tabel (baris) kelas berbasis data tersedia untuk metode pengujian di kelas (Test1 dan Test2) dengan cara yang sama persis seperti yang Anda lakukan untuk pengujian berbasis data.
Anda membuat file XML DataSource untuk kelas berbasis data dengan cara yang sama persis seperti yang Anda lakukan untuk pengujian berbasis data. Contoh berikut menunjukkan file XML untuk kelas asli dan terkelola.
Asli
1 <?xml version="1.0"?>
2 <Data>
3 <Table Id="ClassTable">
4 <ParameterTypes>
5 <ParameterType Name="Size">int</ParameterType>
6 </ParameterTypes>
7 <Row>
8 <Parameter Name="Size">4</Parameter>
9 <Parameter Name="Color">White</Parameter>
10 </Row>
11 <Row>
12 <Parameter Name="Size">10</Parameter>
13 <Parameter Name="Color">Black</Parameter>
14 </Row>
15 <Row>
16 <Parameter Name="Size">9</Parameter>
17 <Parameter Name="Color">Orange</Parameter>
18 </Row>
19 <Row>
20 <Parameter Name="Size">9</Parameter>
21 <Parameter Name="Color">Blue</Parameter>
22 </Row>
23 </Table>
24</Data>
Dikelola
1 <?xml version="1.0"?>
2 <Data>
3 <Table Id="ClassTable">
4 <ParameterTypes>
5 <ParameterType Name="Size">Int32</ParameterType>
6 <ParameterType Name="Color">String</ParameterType>
7 </ParameterTypes>
8 <Row>
9 <Parameter Name="Size">4</Parameter>
10 <Parameter Name="Color">White</Parameter>
11 </Row>
12 <Row>
13 <Parameter Name="Size">10</Parameter>
14 <Parameter Name="Color">Black</Parameter>
15 </Row>
16 <Row>
17 <Parameter Name="Size">9</Parameter>
18 <Parameter Name="Color">Orange</Parameter>
19 </Row>
20 <Row>
21 <Parameter Name="Size">9</Parameter>
22 <Parameter Name="Color">Blue</Parameter>
23 </Row>
24 </Table>
25</Data>
Di Balik Layar ATAU Apa yang Diharapkan?
Secara default, ketika Anda menulis pengujian di TAEF, urutan eksekusi dalam kelas sama dengan urutan di mana Anda mengkodekan metode pengujian di kelas . Oleh karena itu, dalam contoh sebelumnya, Test1 akan selalu dijalankan sebelum Test2. Karena kelas yang berisi Test1 dan Test2 adalah kelas berbasis data, semua metode kelas akan dijalankan sekali untuk setiap ROW data yang Anda tentukan di DataSource. Dengan kata lain, Test1 dan Test2 dijalankan untuk Baris #0. Kemudian, metode ini dijalankan dalam urutan yang sama untuk Baris #1 dan sebagainya sampai TAEF menjalankan semua baris.
Menjalankan pengujian di Kelas Berbasis Data
Jika Anda menjalankan contoh biner pengujian dengan opsi perintah /list , urutan eksekusi dari bagian sebelumnya menjadi jelas.
Asli
TE.exe Examples\CPP.AdvancedDataDriven.Examples.dll /name:*class* /list
Test Authoring and Execution Framework v2.9.3k for x86
F:\ Examples\CPP.AdvancedDataDriven.Examples.dll
WEX::TestExecution::Examples::DataDrivenClassExample#0
WEX::TestExecution::Examples::DataDrivenClassExample#0::Test1
WEX::TestExecution::Examples::DataDrivenClassExample#0::Test2
WEX::TestExecution::Examples::DataDrivenClassExample#1
WEX::TestExecution::Examples::DataDrivenClassExample#1::Test1
WEX::TestExecution::Examples::DataDrivenClassExample#1::Test2
WEX::TestExecution::Examples::DataDrivenClassExample#2
WEX::TestExecution::Examples::DataDrivenClassExample#2::Test1
WEX::TestExecution::Examples::DataDrivenClassExample#2::Test2
WEX::TestExecution::Examples::DataDrivenClassExample#3
WEX::TestExecution::Examples::DataDrivenClassExample#3::Test1
WEX::TestExecution::Examples::DataDrivenClassExample#3::Test2
Dikelola
TE.exe Examples\CSharp.AdvancedDataDriven.Examples.dll /name:*class* /list
Test Authoring and Execution Framework v2.9.3k for x86
F:\ Examples\CSharp.AdvancedDataDriven.Examples.dll
WEX.Examples.CSharpDataDrivenClassExample#0
WEX.Examples.CSharpDataDrivenClassExample#0.Test1
WEX.Examples.CSharpDataDrivenClassExample#0.Test2
WEX.Examples.CSharpDataDrivenClassExample#1
WEX.Examples.CSharpDataDrivenClassExample#1.Test1
WEX.Examples.CSharpDataDrivenClassExample#1.Test2
WEX.Examples.CSharpDataDrivenClassExample#2
WEX.Examples.CSharpDataDrivenClassExample#2.Test1
WEX.Examples.CSharpDataDrivenClassExample#2.Test2
WEX.Examples.CSharpDataDrivenClassExample#3
WEX.Examples.CSharpDataDrivenClassExample#3.Test1
WEX.Examples.CSharpDataDrivenClassExample#3.Test2
Perhatikan bahwa indeks dalam contoh di atas mirip dengan pengujian berbasis data. Setiap baris di kelas berbasis data diidentifikasi oleh indeks. Sama seperti dalam pengujian berbasis data, Anda dapat memilih untuk memberi baris apa pun Nama pendek yang lebih bermakna dengan menentukan metadata di tingkat Baris dalam file XML dan mencetak nama tersebut alih-alih indeks saat mencantumkan atau menjalankan pengujian.
Demikian pula, Anda menggunakan opsi /listproperties untuk mengonfirmasi bahwa data memang ditentukan dan tersedia di tingkat kelas.
Asli
F:\ Examples\CPP.AdvancedDataDriven.Examples.dll
WEX::TestExecution::Examples::DataDrivenClassExample#0
Property[DataSource] = Table:DataDrivenClassExample.xml#ClassTable
Data[Color] = White
Data[Size] = 4
WEX::TestExecution::Examples::DataDrivenClassExample#0::Test1
WEX::TestExecution::Examples::DataDrivenClassExample#0::Test2
WEX::TestExecution::Examples::DataDrivenClassExample#1
Property[DataSource] = Table:DataDrivenClassExample.xml#ClassTable
Data[Color] = Black
Data[Size] = 10
WEX::TestExecution::Examples::DataDrivenClassExample#1::Test1
WEX::TestExecution::Examples::DataDrivenClassExample#1::Test2
WEX::TestExecution::Examples::DataDrivenClassExample#2
Property[DataSource] = Table:DataDrivenClassExample.xml#ClassTable
Data[Color] = Orange
Data[Size] = 9
WEX::TestExecution::Examples::DataDrivenClassExample#2::Test1
WEX::TestExecution::Examples::DataDrivenClassExample#2::Test2
WEX::TestExecution::Examples::DataDrivenClassExample#3
Property[DataSource] = Table:DataDrivenClassExample.xml#ClassTable
Data[Color] = Blue
Data[Size] = 9
WEX::TestExecution::Examples::DataDrivenClassExample#3::Test1
WEX::TestExecution::Examples::DataDrivenClassExample#3::Test2
Dikelola
F:\ Examples\CSharp.AdvancedDataDriven.Examples.dll
WEX.Examples.CSharpDataDrivenClassExample#0
Setup: MyClassInitialize
Property[DataSource] = Table:CSharpDataDrivenClassExample.xml#ClassTable
Data[Color] = White
Data[Size] = 4
WEX.Examples.CSharpDataDrivenClassExample#0.Test1
WEX.Examples.CSharpDataDrivenClassExample#0.Test2
WEX.Examples.CSharpDataDrivenClassExample#1
Setup: MyClassInitialize
Property[DataSource] = Table:CSharpDataDrivenClassExample.xml#ClassTable
Data[Color] = Black
Data[Size] = 10
WEX.Examples.CSharpDataDrivenClassExample#1.Test1
WEX.Examples.CSharpDataDrivenClassExample#1.Test2
WEX.Examples.CSharpDataDrivenClassExample#2
Setup: MyClassInitialize
Property[DataSource] = Table:CSharpDataDrivenClassExample.xml#ClassTable
Data[Color] = Orange
Data[Size] = 9
WEX.Examples.CSharpDataDrivenClassExample#2.Test1
WEX.Examples.CSharpDataDrivenClassExample#2.Test2
WEX.Examples.CSharpDataDrivenClassExample#3
Setup: MyClassInitialize
Property[DataSource] = Table:CSharpDataDrivenClassExample.xml#ClassTable
Data[Color] = Blue
Data[Size] = 9
WEX.Examples.CSharpDataDrivenClassExample#3.Test1
WEX.Examples.CSharpDataDrivenClassExample#3.Test2
Anda dapat menerapkan semua aturan eksekusi ke kelas berbasis data. Anda dapat mendasarkan kueri pilihan Anda pada apa pun yang bisa Anda cantumkan di opsi /listproperties .
Pengujian berbasis data di Kelas Berbasis Data
Anda tidak terbatas pada cara apa pun yang memiliki pengujian berbasis data dalam kelas berbasis data. Pendekatan ini dapat berguna saat menulis pengujian API. Anda dapat menyimpan data umum untuk semua pengujian di kelas di DataSource tingkat kelas. Anda menentukan data yang merupakan metode pengujian khusus dalam metadata DataSource untuk metode yang Anda tandai sebagai berbasis data.
CATATAN: Dalam kasus seperti itu, urutan eksekusi sedikit lebih terlibat.
Contoh berikut menunjukkan bagaimana dua contoh biner sebelumnya dirender dengan opsi perintah /list .
Asli
TE.exe Examples\CPP.AdvancedDataDriven.Examples.dll /name:*nested* /list
Test Authoring and Execution Framework v2.9.3k for x86
F:\ Examples\CPP.AdvancedDataDriven.Examples.dll
WEX::TestExecution::Examples::NestedDataDrivenExample#0
WEX::TestExecution::Examples::NestedDataDrivenExample#0::Test1
WEX::TestExecution::Examples::NestedDataDrivenExample#0::Test2#0
WEX::TestExecution::Examples::NestedDataDrivenExample#0::Test2#1
WEX::TestExecution::Examples::NestedDataDrivenExample#0::Test2#2
WEX::TestExecution::Examples::NestedDataDrivenExample#0::Test2#3
WEX::TestExecution::Examples::NestedDataDrivenExample#1
WEX::TestExecution::Examples::NestedDataDrivenExample#1::Test1
WEX::TestExecution::Examples::NestedDataDrivenExample#1::Test2#0
WEX::TestExecution::Examples::NestedDataDrivenExample#1::Test2#1
WEX::TestExecution::Examples::NestedDataDrivenExample#1::Test2#2
WEX::TestExecution::Examples::NestedDataDrivenExample#1::Test2#3
WEX::TestExecution::Examples::NestedDataDrivenExample#2
WEX::TestExecution::Examples::NestedDataDrivenExample#2::Test1
WEX::TestExecution::Examples::NestedDataDrivenExample#2::Test2#0
WEX::TestExecution::Examples::NestedDataDrivenExample#2::Test2#1
WEX::TestExecution::Examples::NestedDataDrivenExample#2::Test2#2
WEX::TestExecution::Examples::NestedDataDrivenExample#2::Test2#3
WEX::TestExecution::Examples::NestedDataDrivenExample#3
WEX::TestExecution::Examples::NestedDataDrivenExample#3::Test1
WEX::TestExecution::Examples::NestedDataDrivenExample#3::Test2#0
WEX::TestExecution::Examples::NestedDataDrivenExample#3::Test2#1
WEX::TestExecution::Examples::NestedDataDrivenExample#3::Test2#2
WEX::TestExecution::Examples::NestedDataDrivenExample#3::Test2#3
Dikelola
TE.exe Examples\CSharp.AdvancedDataDriven.Examples.dll /name:*nested* /list
Test Authoring and Execution Framework v2.9.3k for x86
F:\ Examples\CSharp.AdvancedDataDriven.Examples.dll
WEX.Examples.CSharpDataDrivenNestedExample#0
WEX.Examples.CSharpDataDrivenNestedExample#0.Test1
WEX.Examples.CSharpDataDrivenNestedExample#0.Test2#0
WEX.Examples.CSharpDataDrivenNestedExample#0.Test2#1
WEX.Examples.CSharpDataDrivenNestedExample#0.Test2#2
WEX.Examples.CSharpDataDrivenNestedExample#0.Test2#3
WEX.Examples.CSharpDataDrivenNestedExample#1
WEX.Examples.CSharpDataDrivenNestedExample#1.Test1
WEX.Examples.CSharpDataDrivenNestedExample#1.Test2#0
WEX.Examples.CSharpDataDrivenNestedExample#1.Test2#1
WEX.Examples.CSharpDataDrivenNestedExample#1.Test2#2
WEX.Examples.CSharpDataDrivenNestedExample#1.Test2#3
WEX.Examples.CSharpDataDrivenNestedExample#2
WEX.Examples.CSharpDataDrivenNestedExample#2.Test1
WEX.Examples.CSharpDataDrivenNestedExample#2.Test2#0
WEX.Examples.CSharpDataDrivenNestedExample#2.Test2#1
WEX.Examples.CSharpDataDrivenNestedExample#2.Test2#2
WEX.Examples.CSharpDataDrivenNestedExample#2.Test2#3
WEX.Examples.CSharpDataDrivenNestedExample#3
WEX.Examples.CSharpDataDrivenNestedExample#3.Test1
WEX.Examples.CSharpDataDrivenNestedExample#3.Test2#0
WEX.Examples.CSharpDataDrivenNestedExample#3.Test2#1
WEX.Examples.CSharpDataDrivenNestedExample#3.Test2#2
WEX.Examples.CSharpDataDrivenNestedExample#3.Test2#3
CATATAN: Satu-satunya batasan dalam hal ini adalah bahwa tabel untuk dua contoh tidak dapat berada dalam file DataSource yang sama. Dengan kata lain, DataSource untuk kelas berbasis data dan metode pengujian berbasis data yang dikandungnya harus berbeda.
Perhatikan bahwa metode Test2 dalam contoh kami adalah pengujian berbasis data dalam kelas berbasis data. Misalnya, dalam baris WEX. Examples.CSharpDataDrivenestedExample#3.Test2#0, #3 adalah indeks untuk kelas , dan #0 adalah indeks untuk pengujian berbasis data dalam kelas tersebut. Test2 dapat mengakses kedua tabel: data di baris instans kelas tempatnya berada dan data di baris saat ini untuk tabel DataSource-nya sendiri. Dengan kata lain, data di tingkat kelas dan data pada tingkat metode pengujian dikumpulkan bersama-sama dan tersedia selama eksekusi metode pengujian.
Apa yang terjadi dalam kasus data yang bertentangan - jika nama data yang sama ditentukan pada tingkat kelas dan tingkat metode? TAEF memproses kondisi ini dengan cara yang sama seperti memproses properti metadata. Data yang ditentukan dalam Baris pada tingkat metode akan mengambil alih data yang ditentukan dalam Baris di tingkat kelas.
Misalnya, pertimbangkan kasus ketika Anda memiliki parameter yang disebut Ukuran yang ditentukan baik di tingkat kelas maupun di tingkat metode pengujian. Pada tingkat kelas, Ukuran didefinisikan dari jenis Array String , tetapi pada tingkat metode pengujian, didefinisikan sebagai int. Dalam hal ini, jenis int mengambil alih jenis Array String pada tingkat metode pengujian, serta pada metode Penyiapan dan Teardown untuk pengujian. Namun pada metode Penyiapan dan Teardown di tingkat kelas, Ukuran memiliki jenis data Array String .
Jika Anda memiliki data yang bertentangan dalam kode Anda, TAEF menunjukkan peringatan selama eksekusi dan mencantumkan properti, tetapi data yang bertentangan tidak akan mengakibatkan kegagalan apa pun.