简单数据驱动测试示例

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

第一个示例是一个名为 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”,而通过不指定类型,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> 块之后,你会有一组相同的 <行>,每行都对应于托管和本机示例中的一组数据。 在这种情况下,有 4 组数据通过 4 <Row> 块定义,每个数据集使用 <Parameter> 标签指定参数的值。

这涵盖了数据源文件的各个部分的基本基础知识。 现在,让我们看看如何检索在上述 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 示例\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 示例\CSharp.DataDriven.Example.dll Examples\CPP.DataDriven.Example.dll /select:“@Name='*Simple*' and not(@DataSource=*)”

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

TE.exe 示例\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 示例\CSharp.DataDriven.Example.dll Examples\CPP.DataDriven.Example.dll /select:“@Name='*Simple*' and @Data:Index=1”

上述将运行“Black”选择的相同两个测试。 您甚至通过使用 @Data:Index > lowerGuardValue 和 @Data:index< upperGuardValue 来为索引选择添加防护措施。

如果您了解使用 TAEF 进行数据驱动测试的基础知识,请继续查看以下示例中的下一个课程: 覆盖行级别的元数据指定数组参数类型