次の方法で共有


アレイ サポート データ ドリブン テストの例

このセクションでは、例を使用してデータ ドリブン テストのいくつかの高度な機能について説明します。 まだ基本を学習中の方は、まず単純なデータ ドリブンの例に関するページを参照してください。

参照した例:

  • 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 のデータドリブン テストのみを選択します。 演習として、このクエリを自分で記述して実行してみてください。