简单的数据驱动的测试示例
本部分介绍多个数据驱动测试示例,并介绍每个示例中的特定功能。
第一个示例是一个名为 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 元数据包含三个部分:
- “Table:”- 这会将数据源标识为 XML 表。
- “DataDrivenTests.xml”- 这是包含 XML 表的文件。
- “#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 进行数据驱动测试的基础知识,请按照相同示例中的下一个类进行操作: 在行级别重写元数据, 指定数组参数类型。