シンプルなデータ ドリブン テストの例
このセクションでは、データ ドリブン テストのいくつかの例について説明すると共に、それぞれの例で特定の機能について取り上げます。
最初の例は、SimpleDataDrivenExample と呼ばれる基本的なデータ ドリブン テストです。
マネージド例では、次のような XML ファイルがあります。
1 <?xml version="1.0"?>
2 <Data>
3 <Table Id="Table1">
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>
この XML ファイルは、使用するデータ ドリブン テストのデータ パラメーターを定義します。 最上位の XML ノードは <Data> タグであり、その中に少なくとも 1 つの <Table> タグが定義されます。 すべてのテーブルは、一意の "ID" 属性に関連付けられている必要があります。 テスト関数では、テーブル ID 値を使用して、XML ファイルで使用する特定のテーブルを識別します。
<Table> タグ内には、オプションの <ParameterTypes> セクションがあります。 ここでは、<ParameterTypes> タグを使用して、特定のパラメーターのデータ型を明示的に指定できます。 上記の例では、パラメーター "Size" が "Int32" 型で、パラメーター "Color" が文字列であることを明示的に指定しています。 まとめると、ParameterTypes セクションは省略可能です。既定では、パラメーターの型情報が指定されていない場合は、文字列として保存されます。
マネージドとネイティブの例を比較すると、両者の唯一の違いは <ParameterTypes> ブロックであることがわかります。 ネイティブ XML ファイルは、Size をネイティブの整数型 "int" に指定しています。また、Color については、型を指定しないことで、既定の型 WEX::Common::String を使用しています。 便宜上、次の例はネイティブの例の XML ファイルを示しています。
1 <?xml version="1.0"?>
2 <Data>
3 <Table Id="SimpleTable">
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>
ネイティブ コードとマネージド コードでサポートされているパラメーターの型は、「テーブルのデータ ソースにおけるパラメーターの型」に記載されています。
他のデータ型が指定されている場合、テストで警告がスローされ、文字列と見なされます。
引き続き先ほどの XML ファイルを見てみると、両方の XML ファイルの <ParameterTypes> ブロックの後に、同じ一連の <Row> が存在します。マネージドとネイティブのどちらの例も、この Row がそれぞれ 1 つのデータ セットに対応します。 この特定のケースでは、4 つの <Row> ブロックを使用して定義された 4 セットのデータがあり、それぞれ <Parameter> タグを使用してパラメーターの値が指定されています。
以上、データ ソース ファイルのさまざまな部分の基本的な要素について取り上げました。 次に、上記の XML ファイルで指定した値を取得する方法を見てみましょう。
データ ドリブン テストとして作成する
データが決まったら、そのデータを使用するコードまたはテスト メソッドを、XML ファイル内のこのデータに関連付ける方法が必要です。 これを行うには、マネージドとネイティブの両方の例で、"DataSource" メタデータを指定します。 DataSource メタデータには、次の 3 つの部分があります。
- "Table:" - データ ソースが XML テーブルであることを示します。
- "DataDrivenTests.xml" - XML テーブルを含むファイルです。
- "#Table2" - "#" 区切り記号の後の "Table2" 値は、使用する XML ドキュメント内の特定のテーブルを識別します。 1 つの XML テーブル データ ソースに複数のテーブルを含めることができます。 TAEF は XML ファイルを調べて、'Id' 属性が指定された値と一致する Table 要素を探します。
もう一度、上記の側面をカバーするコードを簡単に見てみましょう。
[ネイティブ コード]
1 class SimpleDataDrivenExample
2 {
3 BEGIN_TEST_CLASS(SimpleDataDrivenExample)
4 TEST_CLASS_PROPERTY(L"Description", L"Simple example in table-based data-driven tests")
5 END_TEST_CLASS()
6
7 TEST_METHOD_CLEANUP(TestCleanup);
8 TEST_METHOD_SETUP(TestSetup);
9
10 BEGIN_TEST_METHOD(DataDrivenTest)
11 TEST_METHOD_PROPERTY(L"DataSource", L"Table:SimpleDataDrivenExample.xml#SimpleTable")
11 END_TEST_METHOD()
12 ...
マネージド コード
1 [TestMethod]
2 [DataSource("Table:CSharpDataDrivenSimpleExample.xml#SimpleTable")]
3 public void DataDrivenTest()
4 {
5 ...
6 }
"DataSource" は、Microsoft.VisualStudio.TestTools.UnitTesting の既知のプロパティです。
マネージド コードのデータ ドリブン テストには、上記に加えて、いくつかの手順が必要です。 また、プライベート TestContext プロパティを定義する必要もあります。 詳細については、「TestContext クラス」を参照してください。 また、このプロパティに対してパブリック アクセサーを定義します。 この TestContext プロパティは TAEF によって内部的に設定され、このプロパティを介してデータにアクセスできるようになります。 コードのこの部分を簡単に見てみましょう。
1 public TestContext TestContext
2 {
3 get;
4 set;
5 }
Test メソッドでのデータの取得
取得 API は、マネージド コードとネイティブ コードで異なります。 まず、ネイティブ取得 API について理解しましょう。
1 void SimpleDataDrivenExample::DataDrivenTest()
2 {
3 int size;
4 if (SUCCEEDED(TestData::TryGetValue(L"size", size)))
5 {
6 VERIFY_ARE_NOT_EQUAL(size, 0);
7 Log::Comment(String().Format(L"Size retrieved was %d", size));
8 }
9
10 String color;
11 if (SUCCEEDED(TestData::TryGetValue(L"color", color)))
12 {
13 Log::Comment(L"Size retrieved was " + color);
14 }
15
16 unsigned int index;
17 if (SUCCEEDED(TestData::TryGetValue(L"index", index)))
18 {
19 Log::Comment(String().Format(L"At index %d", index));
20 }
21 }
4 行目、11 行目、17 行目に特に注意してください。 これらの行の前に、取得したデータを保存するためのローカル変数を定義します。 ここで型を取得することが重要です。 XML ファイルで "Size" を "int" 型に定義したので、それを取得する int 型のローカル変数を定義する必要があります。 取得 API は、文字列値として取得するパラメーターの名前を第 1 パラメーターとして受け取ります。 第 2 パラメーターは、参照によって渡され、TAEF コードによって設定されるローカル変数です。
この取得 API は TestData.h で定義され、すべての TAEF テストでインクルードされる WexTestClass.h ヘッダーに含まれます。
マネージド コードでデータを取得するには、定義した TestContext プロパティを使用します。 以下のコード (または例) を見てください。
1 public void DataDrivenTest()
2 {
3 int size = (int)m_testContext.DataRow["Size"];
4 Verify.AreNotEqual(size, 0);
5 Log.Comment("Size is " + size.ToString());
6
7 Log.Comment("Color is " + m_testContext.DataRow["Color"]);
8 UInt32 index = (UInt32)m_testContext.DataRow["Index"];
9 Log.Comment("At index " + index.ToString());
10 }
VSTS に慣れている方は、上の例が似ていることがわかります。 DataRow を使用し、取得しようとしているパラメーターの名前として列名を指定します。
この例を見ると、同じクラスに非データ ドリブン テストもあります。 つまり、データ ドリブンのテストとデータ ドリブンでないテストを同じテスト クラスで柔軟に組み合わせることができるということです。
TAEF を使用した SimpleDataDrivenExample の実行
TAEF での DataDrivenTests の実行に関するヒントとコツについて開始する前に、データドリブン テストを作成する方法と TAEF でテストを実行する方法を理解していることを確認してください。 選択が TAEF でどのように機能するかについて、改めて確認しておくとよいでしょう。
データ ドリブン テストを実行するためのコマンド プロンプトは、TAEF を使用した汎用テストの実行と大きく変わるものではありません。 上記の両方の例 (ネイティブとマネージド) を実行するには、次のコマンドを実行します。
TE.exe Examples\CPP.DataDriven.Example.dll Examples\CSharp.DataDriven.Example.dll /name:*Simple*
"/name" は、名前に基づいて選択条件を追加し、目的のクラスのみを選択します。 クラス内から実行するテストを選択するには、まず dll のすべてのプロパティを一覧表示する必要があります。 次に、選択基準に使用するプロパティを決定できます。
TE.exe Examples\CPP.DataDriven.Example.dll Examples\CSharp.DataDriven.Example.dll /name:*Simple* /listproperties
f:\Examples\CPP.DataDriven.Example.dll
WEX::TestExecution::Examples::SimpleDataDrivenExample
Property[Description] = Simple example in table-based data-driven tests
WEX::TestExecution::Examples::SimpleDataDrivenExample::DataDrivenTest#0
Setup: TestSetup
Teardown: TestCleanup
Property[DataSource] = Table:SimpleDataDrivenExample.xml#SimpleTable
Data[Color] = White
Data[Size] = 4
WEX::TestExecution::Examples::SimpleDataDrivenExample::DataDrivenTest#1
Setup: TestSetup
Teardown: TestCleanup
Property[DataSource] = Table:SimpleDataDrivenExample.xml#SimpleTable
Data[Color] = Black
Data[Size] = 10
WEX::TestExecution::Examples::SimpleDataDrivenExample::DataDrivenTest#2
Setup: TestSetup
Teardown: TestCleanup
Property[DataSource] = Table:SimpleDataDrivenExample.xml#SimpleTable
Data[Color] = Orange
Data[Size] = 9
WEX::TestExecution::Examples::SimpleDataDrivenExample::DataDrivenTest#3
Setup: TestSetup
Teardown: TestCleanup
Property[DataSource] = Table:SimpleDataDrivenExample.xml#SimpleTable
Data[Color] = Blue
Data[Size] = 9
WEX::TestExecution::Examples::SimpleDataDrivenExample::FirstNonDataDrivenTest
Setup: TestSetup
Teardown: TestCleanup
WEX::TestExecution::Examples::SimpleDataDrivenExample::SetsOfDataTest#metadataSet0
Setup: TestSetup
Teardown: TestCleanup
Property[Data:Color] = {Purple, Maroon, Brown}
Data[Color] = Purple
WEX::TestExecution::Examples::SimpleDataDrivenExample::SetsOfDataTest#metadataSet1
Setup: TestSetup
Teardown: TestCleanup
Property[Data:Color] = {Purple, Maroon, Brown}
Data[Color] = Maroon
WEX::TestExecution::Examples::SimpleDataDrivenExample::SetsOfDataTest#metadataSet2
Setup: TestSetup
Teardown: TestCleanup
Property[Data:Color] = {Purple, Maroon, Brown}
Data[Color] = Brown
WEX::TestExecution::Examples::SimpleDataDrivenExample::SecondNonDataDrivenTest
Setup: TestSetup
Teardown: TestCleanup
f:\Examples\CSharp.DataDriven.Example.dll
WEX.Examples.CSharpDataDrivenSimpleExample
Setup: MyClassInitialize
Property[Description] = Simple example in table-based data-driven tests
WEX.Examples.CSharpDataDrivenSimpleExample.DataDrivenTest#0
Property[DataSource] = Table:CSharpDataDrivenSimpleExample.xml#SimpleTable
Data[Color] = White
Data[Size] = 4
WEX.Examples.CSharpDataDrivenSimpleExample.DataDrivenTest#1
Property[DataSource] = Table:CSharpDataDrivenSimpleExample.xml#SimpleTable
Data[Color] = Black
Data[Size] = 10
WEX.Examples.CSharpDataDrivenSimpleExample.DataDrivenTest#2
Property[DataSource] = Table:CSharpDataDrivenSimpleExample.xml#SimpleTable
Data[Color] = Orange
Data[Size] = 9
WEX.Examples.CSharpDataDrivenSimpleExample.DataDrivenTest#3
Property[DataSource] = Table:CSharpDataDrivenSimpleExample.xml#SimpleTable
Data[Color] = Blue
Data[Size] = 9
WEX.Examples.CSharpDataDrivenSimpleExample.NonDataDrivenTest
WEX.Examples.CSharpDataDrivenSimpleExample.SetsOfMetadataTest#metadataSet0
Property[Data:Color] = {Red, Green, Blue}
Data[Color] = Red
WEX.Examples.CSharpDataDrivenSimpleExample.SetsOfMetadataTest#metadataSet1
Property[Data:Color] = {Red, Green, Blue}
Data[Color] = Green
WEX.Examples.CSharpDataDrivenSimpleExample.SetsOfMetadataTest#metadataSet2
Property[Data:Color] = {Red, Green, Blue}
Data[Color] = Blue
ここでは、上記の SetsOfMetadataTest と SetsOfDataTest には触れません。 興味がある場合は、「ライトウェイト データ ドリブン テスト」で詳しい情報をご覧ください。 さまざまなプロパティと Data パラメーターの名前と値がわかれば、それに基づいて特定のテストを選択できます。 それらを試して、選択した内容を確認してみましょう。
非データ ドリブン テストのみを実行するには、次のコマンドを実行します。
TE.exe Examples\CSharp.DataDriven.Example.dll Examples\CPP.DataDriven.Example.dll /select:"@Name='*Simple*' And not(@DataSource=*)"
今度は、色が "Black" として指定されているデータ ドリブン テストのみを実行するには、次を実行します。
TE.exe Examples\CSharp.DataDriven.Example.dll Examples\CPP.DataDriven.Example.dll /select:"@Name='*Simple*' And @Data:Color='Black'"
"Color" と同じように、 @Data:<DataDrivenParameterName>=<DataDrivenParameterValue> は、指定された DataDriven パラメーターの値に基づいて特定のデータを実行します。 上記のケースでは、WEX::TestExecution::Examples::SimpleDataDrivenExample::DataDrivenTest#1 と WEX.Examples.CSharpDataDrivenSimpleExample.DataDrivenTest#1 が実行されます。
上記の listproperties のテスト インデックスに注目してください。 そのインデックスに基づいて上記を選択することもできます。
TE.exe Examples\CSharp.DataDriven.Example.dll Examples\CPP.DataDriven.Example.dll /select:"@Name='*Simple*' And @Data:Index=1"
上記では、@Data:Color='Black' によって選択された同じ 2 つのテストが実行されます。 @Data:Index > lowerGuardValue と @Data:index< upperGuardValue を使用して、インデックスの選択にガードを追加することもできます
TAEF を使用したデータ ドリブン テストの基礎が理解できたら、同じ例を使った次のクラス (Row レベルでのメタデータのオーバーライド、配列パラメーター型の指定) に進んでください。