数组支持数据驱动测试示例

本部分介绍通过示例进行数据驱动测试的一些高级功能。 如果仍在介绍基础知识,可能需要从 简单数据驱动示例开始。

引用的示例:

  • ArraySupportDataDrivenExample

  • CSharpDataDrivenArraySupportExample

前面的部分已经介绍了数据驱动测试创作和执行的基础知识。 以下列表讨论了 TAEF 数据驱动测试感知中 数组 的含义:

  • 数组是可变长度、同质类型的元素集,这些元素被视为单个参数。
  • 若要指定数组类型,需要在 ParameterTypes 块中显式指定参数的类型,并添加 Array=“true”属性。

支持的参数类型列在表数据源 参数类型中。

如果指定了任何其他数据类型,测试将引发警告,并将其视为字符串。 对于数组,数据类型将被视为 String[] 类型。

以下示例演示如何指定参数是其中一种基本类型的数组。 请务必注意,在数组的情况下不允许使用默认类型 - 必须显式指定类型并设置参数的 Array 属性,才能使参数为 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>

检查上面的示例中的 标记和 数组 属性。 首先,必须显式指定 SizeColor 参数的类型,并通过将 Array 属性设置为 true来指定这些参数是数组。 然后,在 <Value>...</Value> 标记中指定值。 可以具有任意数量的 <值> 标记,因为需要为给定行的参数在数组中指定任意数量的值。

请注意上述 XML 示例中的第 9 行、10 行、30 行和 33 行。 这些条目是单个值数组元素。 换句话说,可以直接在 <参数> 标记中指定单个值数组元素,而无需额外的 <值> 标记。 此外,尽管行中的参数只有一个值,但它仍被视为一个元素的数组,否则无法检索。

现在,请查看检索 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,要求它检索参数 大小,并将值放入局部变量 大小

请注意,尝试将非数组指定的参数检索到数组会导致错误,并且测试失败。 同样,尝试将数组检索到非数组变量中,即使数组只有一个元素,也会导致错误。

如果未在 XML 行中指定数组参数,则尝试检索参数将失败。 例如,如果行如下所示:

       <Row>
         <Parameter Name="Color">
           <Value>White</Value>
           <Value>Black</Value>
         </Parameter>
       </Row>

请注意,参数 Size(数组)未在行中指定。 如果尝试从代码中检索 大小,API 调用将返回失败的返回代码。 可以使用它来定义默认数组值。

另一方面,可以通过为 Size 指定空参数标记来指定空数组,如下所示:

       <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>

请注意,参数 Size(数组)未在行中指定。 如果尝试从代码中检索 大小,API 调用将返回 DBNull类型的对象。 如果表中有任何此类值,可能需要先将其从上下文检索到对象中,并在比较对象类型与 typeof(System.DBNull) 或要执行其类型之后采取适当的步骤。

另一方面,可以通过为 Size 指定空参数标记来指定空数组,如下所示:

       <Row>
         <Parameter Name="Size"></Parameter>
         <Parameter Name="Color">
           <Value>White</Value>
           <Value>Black</Value>
         </Parameter>
       </Row>

在这种情况下,尝试检索 大小 可成功返回 System.Int32[]类型的空数组。

执行

执行支持数组的数据驱动测试与执行任何其他数据驱动测试没有什么不同。 唯一的区别要点是,选择条件的信号在数组数据参数的情况下发生变化,以表示“包含”而不是“equals”。

若要查看这意味着什么,假设你想要选择所有数据驱动测试,其中 颜色 数组包含 白色的值。 为此,请运行:

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 的数据驱动测试。 作为练习,请尝试自行编写和执行此查询。