アレイ サポート データ ドリブン テストの例
このセクションでは、例を使用してデータ ドリブン テストのいくつかの高度な機能について説明します。 まだ基本を学習中の方は、まず単純なデータ ドリブンの例に関するページを参照してください。
参照した例:
ArraySupportDataDrivenExample
CSharpDataDrivenArraySupportExample
これまでのセクションで、データ ドリブン テストの作成と実行の基本について既に説明しました。 次の一覧では、TAEF データ ドリブン テストの意味における配列の意味について説明します。
- 配列は、1 つのパラメーターとして扱われる要素の可変長の同種型セットです。
- 配列型を指定するには、ParameterTypes ブロックでパラメーターの型を明示的に指定し、Array="true" 属性を追加する必要があります。
サポートされているパラメーターの型は、テーブル データ ソースの パラメーター型の一覧に記載されています。
他のデータ型が指定されている場合、テストは警告をスローし、文字列と見なします。 配列の場合、データ型は文字列型と見なされます。
次の例は、パラメーターが基本型の 1 つの配列であることを指定する方法を示しています。 配列の場合、既定の型は使用できないことに注意してください。型を明示的に指定し、パラメーターの 配列 属性を true に設定する必要があります。
1 <?xml version="1.0"?>
2 <Data>
3 <Table Id="ArraySupportTable">
4 <ParameterTypes>
5 <ParameterType Name="Size" Array="true">int</ParameterType>
6 <ParameterType Name="Color" Array="true">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">
14 <Value>4</Value>
15 <Value>6</Value>
16 <Value>8</Value>
17 </Parameter>
18 <Parameter Name="Color">
19 <Value>Red</Value>
20 <Value>Green</Value>
21 <Value>Blue</Value>
22 </Parameter>
23 </Row>
24 <Row>
25 <Parameter Name="Size">
26 <Value>9</Value>
27 <Value>12</Value>
28 <Value>16</Value>
29 </Parameter>
30 <Parameter Name="Color">Orange</Parameter>
31 </Row>
32 <Row>
33 <Parameter Name="Size">9</Parameter>
34 <Parameter Name="Color">
35 <Value>White</Value>
36 <Value>Black</Value>
37 </Parameter>
38 </Row>
39 </Table>
40 </Data>
上記の例の Value タグと Array 属性を調べます。 まず、Size パラメーターと Color パラメーターの両方に型を明示的に指定し、Array 属性を true に設定して、これらのパラメーターが配列であることを指定する必要があります。 次に、値を <Value>...</Value> タグに指定します。 指定された行のパラメーターに対して配列内の任意の数の値を指定する必要がある数の <Value> タグを持つことができます。
上記の XML 例の 9 行目、10 行目、30 行目、33 行目に注目してください。 これらのエントリは、単一の値を持つ配列要素です。 つまり、追加の <Value> タグを使用せずに、<Parameter> タグに単一の値を持つ配列要素を直接指定できます。また、行内のパラメーターに値が 1 つしかない場合でも、そのパラメーターは 1 つの要素の配列として扱われ、それ以外の場合は取得できません。
次に、取得 API を見てみましょう。
ネイティブ取得
配列要素は、WEX::TestExecution::TestDataArray<> テンプレート クラスを使用してネイティブ コードで取得できます。 詳細については、発行されたヘッダー TestData.h を参照してください。 TestDataArray クラスは、配列要素の有効期間を管理し、配列内の特定の値を取得するための便利な API を提供します。
1 namespace WEX { namespace TestExecution
2 {
3 template <typename T>
4 class TECOMMON_API TestDataArray sealed
5 {
6 ...
7 public:
8 TestDataArray();
9 ~TestDataArray();
10 const size_t GetSize() const;
11 T& operator[](size_t index);
12
13 private:
14 ...
15 };
16 } /* namespace TestExecution */ } /* namespace WEX */
GetSize を呼び出すことで配列の長さを取得でき、演算子 [] を使用して特定の要素を取得できます。
次の例は、コードでこれらの関数を使用する方法を示しています。 ネイティブの例の cpp ファイルを考えてみましょう。
1 TestDataArray<int> sizes;
2 if (SUCCEEDED(TestData::TryGetValue(L"size", sizes)))
3 {
4 size_t count = sizes.GetSize();
5 for (size_t i = 0; i < count; ++i)
6 {
7 Log::Comment(String().Format(L"Size[%d] retrieved was %d", i, sizes[i]));
8 }
9 }
10
11 TestDataArray<String> colors;
12 if (SUCCEEDED(TestData::TryGetValue(L"color", colors)))
13 {
14 size_t count = colors.GetSize();
15 for (size_t i = 0; i < count; ++i)
16 {
17 Log::Comment(String().Format(L"Color[%d] retrieved was ", i) + colors[i]);
18 }
19 }
まず、配列型のローカル TestDataArray を定義します。 この場合、 サイズ は int 型の配列であり、 色 は WEX::Common::String 型の配列です。 配列を取得する API は、任意の変数を取得する API に似ています。 TestData::TryGetValue を呼び出し、パラメーター サイズを取得するように要求し、値をローカル変数のサイズに配置します。
配列に指定されていないパラメーターを取得しようとすると、エラーが発生し、テストが失敗します。 同様に、配列に要素が 1 つしかない場合でも、配列を配列以外の変数に取り込もうとすると、エラーが発生します。
XML 行に配列パラメーターが指定されていない場合、パラメーターの取得は失敗します。 たとえば、行は次のようになります。
<Row>
<Parameter Name="Color">
<Value>White</Value>
<Value>Black</Value>
</Parameter>
</Row>
パラメーター サイズ (配列) が行に指定されていないことに注意してください。 コードから サイズ を取得しようとすると、API 呼び出しから失敗したリターン コードが返されます。 これを使用して、既定の配列値を定義できます。
一方、次のように サイズ に空のパラメーター タグを指定することで、空の配列を指定できます。
<Row>
<Parameter Name="Size"></Parameter>
<Parameter Name="Color">
<Value>White</Value>
<Value>Black</Value>
</Parameter>
</Row>
この場合、サイズの取得は成功しますが、配列サイズは 0 になります。
管理された取得
管理された取得は以前とほぼ同じです。ただ、値を適切な配列型のローカル変数に確実に取得する必要があります。 次の管理例について考えてみます。
1 Int32[] sizes = m_testContext.DataRow["Size"] as Int32[];
2 foreach (int size in sizes)
3 {
4 Verify.AreNotEqual(size, 0);
5 Console.WriteLine("Size is " + size.ToString());
6 }
7
8 String[] colors = m_testContext.DataRow["Color"] as String[];
9 foreach (String color in colors)
10 {
11 Console.WriteLine("Color is " + color);
12 }
ネイティブ取得と同様に、XML 行に配列パラメーターが指定されていない場合、パラメーターを取得しようとすると System.DBNull 型のオブジェクトが返されます。 たとえば、行は次のようになります。
<Row>
<Parameter Name="Color">
<Value>White</Value>
<Value>Black</Value>
</Parameter>
</Row>
パラメーター サイズ (配列) が行に指定されていないことに注意してください。 コードから サイズ を取得しようとすると、API 呼び出しは DBNull 型のオブジェクトを返します。 テーブルにそのような値がある場合は、最初にコンテキストからオブジェクトに取得し、オブジェクトの 型を typeof(System.DBNull) または想定している型と比較した後に適切な手順を実行できます。
一方、次のように サイズ に空のパラメーター タグを指定することで、空の配列を指定できます。
<Row>
<Parameter Name="Size"></Parameter>
<Parameter Name="Color">
<Value>White</Value>
<Value>Black</Value>
</Parameter>
</Row>
この場合、サイズを取得しようとすると、System.Int32[] 型の空の配列が返されます。
実行
配列をサポートするデータ ドリブン テストの実行は、他のデータ ドリブン テストの実行と変わりません。 唯一の違いは、配列データパラメーターの場合、選択基準のセマティクスが "等しい"のではなく"含む"ことを意味するように変化することです。
これが何を意味するかを確認するために、色配列に白値が含まれるすべてのデータ ドリブン テストを選択するとします。 これを行うには、次を実行します。
TE.exe Examples\CSharp.DataDriven.Example.dll /select:"@Name='*Array* And @Data:Color='White'"
TE.exe Examples\CPP.DataDriven.Example.dll /select:"@Name='*Array* And @Data:Color='White'"
このコマンドは、上記のいずれの場合も、インデックス #0 と #3 を使用してデータ ドリブン テストを実行します。
たとえば、色の配列に白が含まれ、色配列に黒が含まれているテストのみを選択するなど、より複雑なクエリを作成できます。これは、インデックス #3 のデータドリブン テストのみを選択します。 演習として、このクエリを自分で記述して実行してみてください。