データ ドリブン クラス
このセクションに進む前に、TAEF の基本的な実行と、それを使用してテストを作成する方法を理解していることを確認してください。 また、単純なデータドリブン テストの例のチュートリアルを参照することもできます。 このセクションでは、テーブル ベースのデータ ドリブン テストに基づくデータ ドリブン テスト クラスを作成しますが、WMI ベースまたは PICT ベースのデータドリブン テストも同じ方法が適用されます。
データ ドリブン クラスを使用する場合
複数のテストが同じ入力データに依存する場合があります。 API をテストする場合は、API の動作を一貫して確認するために、同じデータを使用して複数の API テストを実行できます。 シナリオ レベルのテストを実行するときに、シナリオのすべての手順が同じデータでテストされるようにすることができます。 このような場合は、クラス レベルでテスト データを指定すると便利です。
データ ドリブン クラスの作成
特定のクラスがデータ ドリブンであることを指定する方法は、特定のテストがデータ ドリブンであることを指定する方法と同様です。 DataSource メタデータをクラス レベルで適用します。 この値は、対象となる特定のデータ ソースを識別します。 次の例は、データ ドリブン クラスにこれらのプロパティを指定する方法を示しています。
[ネイティブ コード]
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 };
マネージド コード
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 }
これらの例では、ネイティブ コード例の 3 行目とマネージド コード例の 5 行目が、TAEF のデータ ドリブン テスト クラスのデータソースを指定する推奨される方法です。
上記の マネージド コード の例では、13 行目、18 行目、24 行目、28 行目は、マネージド コードのテスト メソッドでデータを使用できるようにする方法を示しています。
次のコード例では、4 行目、11 行目、20 行目、27 行目は、ネイティブ コードのテスト メソッドでデータを使用できるようにする方法を示しています。 データ ドリブン テストの場合とまったく同じ方法で、データ ドリブン クラスのテーブル (行) で定義したデータをクラス (Test1 および Test2) のテスト メソッドで使用できるようにしていることに注目してください。
データ ドリブン テストの 場合とまったく同じ方法で、データ ドリブン クラスの DataSource XML ファイルを作成します。 次の例は、ネイティブ クラスとマネージド クラスの XML ファイルを示しています。
ネイティブ
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>
マネージド
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>
バックグラウンド、または予期されること
既定では、TAEF でテストを作成する場合、クラス内の実行順序は、クラス内のテスト メソッドをコーディングした順序と同じです。 したがって、前の例では、Test1 は常に Test2 より前に実行されます。 Test1 と Test2 を含むクラスはデータ ドリブン クラスであるため、DataSource で定義したデータ行ごとにすべてのクラス メソッドが 1 回実行されます。 つまり、 Test1 と Test2 は行 #0 に対して実行されます。 次に、これらのメソッドは行 #1 に対して同じ順序で実行され、TAEF がすべての行を実行するまで、同じ順序で実行されます。
データ ドリブン クラスでのテストの実行
/list コマンド オプションを使用してサンプル のテスト バイナリを実行すると、前のセクションの実行順序が明確になります。
ネイティブ
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
マネージド
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
上記の例のインデックスは、データドリブン テストに似ている点に注意してください。 データ ドリブン クラスの各行は、インデックスによって識別されます。 データドリブン テストと同様に、XML ファイルの行レベルでメタデータを指定し、テストを一覧表示または実行するときにインデックスの代わりにその名前を出力することで、 任意の行にわかりやすい短い名前を付けることもできます。
同様に、/listproperties オプションを使用して、データが実際に指定され、クラス レベルで使用可能であることを確認します。
ネイティブ
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
マネージド
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
すべての実行ルールをデータ ドリブン クラスに適用できます。 選択クエリは、/listproperties オプションで一覧表示できるものに基づいて実行できます。
データ ドリブン クラスのデータドリブン テスト
データドリブン クラス内でデータドリブン テストを行う場合、いかなる方法でも制限されることはありません。 この方法は、API テストを記述するときに役立ちます。 クラス内のすべてのテストの共通データは、クラス レベルの DataSource に保持できます。 テスト メソッド固有のデータは、データ ドリブンとしてマークするメソッドの DataSource メタデータで指定します。
注: このような場合、実行順序はもう少し複雑になります。
次の例は、前の 2 つのバイナリ例が /list コマンド オプションを使用してレンダリングされる方法を示しています。
ネイティブ
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
マネージド
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
注: この場合の唯一の制限は、2 つの例のテーブルを同じ DataSource ファイルに含めることはできません。 つまり、 データ ドリブン クラスの DataSource と、それに含まれるデータ ドリブン テスト メソッドは異なる必要があります。
この例の Test2 メソッドは、データ ドリブン クラス内のデータドリブン テストであることに注意してください。 たとえば、行 WEX.Examples.CSharpDataDrivenNestedExample#3.Test2#0、#3 はクラスのインデックス、#0 はそのクラス内のデータ ドリブン テストのインデックスです。 Test2 は、両方のテーブル (属するクラス インスタンスの行のデータと、独自の DataSource テーブルの現在の行のデータ) にアクセスできます。 つまり、クラス レベルのデータとテスト メソッド レベルのデータは、まとめて集計され、テスト メソッドの実行中に使用できます。
競合するデータの場合、クラス レベルとメソッド レベルの両方で同じデータ名が指定されている場合はどうなるでしょうか。 TAEF は、メタデータ プロパティを処理するのと同じ方法でこの条件を処理します。 メソッド レベルの Row で指定されたデータは、クラス レベルの Row で指定されたデータをオーバーライドします。
たとえば、クラス レベルとテスト メソッド レベルの両方で指定される Size というパラメーターがある場合を考えてみます。 クラス レベルでは、Size は文字列配列型として定義されますが、テスト メソッド レベルでは int として定義されます。この場合、int 型は、テスト メソッド レベルで、およびテストの Setup メソッドと Teardown メソッドで 文字列配列型をオーバーライドします。 ただし、クラス レベルの Setup メソッドと Teardown メソッドでは、Size には文字列配列データ型があります。
コード内にこのような競合するデータがある場合、TAEF は実行中に警告を表示し、プロパティを一覧表示しますが、競合するデータでエラーは発生しません。