简单的数据驱动的测试示例

本部分介绍多个数据驱动测试示例,并介绍每个示例中的特定功能。

第一个示例是一个名为 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 节点是 <数据> 标记,其中可能包含 在其中定义的一个或多个 <表> 标记。 每个表都需要与唯一的“ID”属性相关联。 测试函数使用表 ID 值来标识它们将在 XML 文件中使用的特定表。

在 Table> 标记中<,有一个可选的 <ParameterTypes> 节。 在这里,可以使用 ParameterTypes 标记显式指定给定参数 <的> 数据类型。 在上面的示例中,显式指定参数“Size”为“Int32”类型,参数“Color”为字符串。 总结一下: ParameterTypes 部分是可选的。默认情况下,如果未提供参数类型信息,则会将其保存为字符串。

如果比较托管示例和本机示例,你会注意到两者之间的唯一区别是 <ParameterTypes> 块。 本机 XML 文件将 Size 指定为本机整数类型“int”,并通过不指定默认类型 WEX::Common::String 作为 Color 的类型。 为方便起见,以下示例显示了本机示例中的 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>

本机托管代码支持的参数类型列在表数据源中的参数类型中

如果指定了任何其他数据类型,则测试将引发警告,并将其视为 String。

继续返回 XML 文件,在两个 XML 文件中的 <ParameterTypes> 块之后,你具有相同的 Row s 集<,每个行>对应于托管和本机示例中的一组数据。 在此特定情况下,你有 4 组数据,由 4 <个行> 块定义,每个数据集使用 <参数> 标记指定参数的值。

这涵盖了数据源文件各个部分的基本基础知识。 现在,让我们看看如何检索在上述 XML 文件中指定的值。

将测试创作为数据驱动测试

指定数据后,需要一种方法来将代码或测试方法与 XML 文件中的此数据一起使用。 通过指定 “DataSource” 元数据,可以在托管和本机示例中执行此操作。 DataSource 元数据包含三个部分:

  1. “Table:”- 这会将数据源标识为 XML 表。
  2. “DataDrivenTests.xml”- 这是包含 XML 表的文件。
  3. “#Table2” - 在“#”delimeter 之后,“Table2”值标识 XML 文档中要使用的特定表。 单个 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 类。 此外,还可以定义此属性的公共评估者。 在内部,TAEF 设置此 TestContext 属性,以便你可以通过它访问数据。 让我们快速了解这部分代码:

    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 将要检索的参数的名称作为字符串值作为其第一个参数。 第二个参数是通过引用传入并由 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 并将列名指定为尝试检索的参数的名称。

如果查看此示例,则同一类中还有一个非数据驱动测试。 换句话说, 你可以灵活地在同一测试类中组合 DataDriven 和 NonDataDriven 测试。

使用 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。 如果对此感到好奇,请阅读 轻量级数据驱动测试的详细信息。 了解各种属性以及数据参数名称和值后,可以基于此选择特定测试。 试用它们,然后继续确认选择的内容。

若要仅运行非数据驱动测试,请运行:

TE.exe Examples\CSharp.DataDriven.Example.dll Examples\CPP.DataDriven.Example.dll /select:“@Name='*Simple*' And not (@DataSource=*) ”

现在,若要仅运行那些数据驱动的测试(其中颜色指定为“黑色”),请运行:

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::D ataDrivenTest#1 和 WEX。Examples.CSharpDataDrivenSimpleExample.DataDrivenTest#1

请注意上述列表属性中的 测试索引 。 也可以根据索引选择上述项。

TE.exe Examples\CSharp.DataDriven.Example.dll Examples\CPP.DataDriven.Example.dll /select:“@Name='*Simple*' and @Data:Index=1”

以上将运行“Black”选择的相同两个测试 @Data:Color=。 你甚至使用 @Data:Index > lowerGuardValue 和 @Data:index< upperGuardValue 将 guard 添加到索引选择

如果了解使用 TAEF 进行数据驱动测试的基础知识,请按照相同示例中的下一个类进行操作: 在行级别重写元数据指定数组参数类型