在某些情况下,完整的 XML DataSource 和基于表的数据驱动测试可能太重,无法满足测试方案需求。 轻量级数据驱动测试允许在测试数据简单且可以轻松地表示为元数据时获取数据驱动的测试支持。 让我们使用一个示例并了解如何作。
轻型数据驱动测试的数据表示为一组元数据(在测试、类或模块级别)。 对于此集中的每个值,将针对集中的每个值执行测试方法以及关联的设置和拆解方法。 让我们看看如何在本机代码中创作此代码:
1 #include "WexString.h"
2 #include "WexTestClass.h"
3
4 using namespace WEX::Common;
5 using namespace WEX::TestExecution;
6 using namespace WEX::Logging;
7 namespace WEX { namespace TestExecution { namespace Examples
8 {
9 class SimpleDataDrivenExample
10 {
11 TEST_CLASS(SimpleDataDrivenExample);
12 ...
13 BEGIN_TEST_METHOD(SetsOfDataTest)
14 TEST_METHOD_PROPERTY(L"Data:Color", L"{Purple, Maroon, Brown}")
15 END_TEST_METHOD()
16 };
请注意第 14 行中TEST_METHOD_PROPERTY的参数值。 测试元数据值以“{”开头,以“}”结尾,指示指定了逗号或分号分隔的值列表。 TAEF 将针对此集中的每个值重新执行一次测试方法,SetOfDataTest()。
另请注意,元数据名称以“Data:”开头。 这意味着元数据集确实指定了数据驱动测试参数的变体,并且可用于实际测试方法,这与基于表的数据驱动测试中的数据参数非常类似,如下所示:
11 ...
12
13 void SimpleDataDrivenExample::SetsOfDataTest()
14 {
15 String color;
16 if (SUCCEEDED(TestData::TryGetValue(L"color", color)))
17 {
18 Log::Comment(L"Color retrieved was " + color);
19 }
20 }
21 } /* namespace Examples */ } /* namespace TestExecution */ } /* namespace WEX */
使用托管代码时,数据集的规范和检索与本机示例非常类似。 我们来看看:
1 namespace WEX.Examples
2 {
3 using Microsoft.VisualStudio.TestTools.UnitTesting;
4 using System;
5 using System.Collections;
6 using System.Data;
7 using WEX.Logging.Interop;
8 using WEX.TestExecution;
9
10 [TestClass]
11 public class CSharpDataDrivenSimpleExample
12 {
13 ...
14 [TestMethod]
15 [TestProperty("Data:Color", "{Red, Green, Blue}")]
16 public void SetsOfMetadataTest()
17 {
18 Log.Comment("Color is " + m_testContext.DataRow["Color"]);
19 }
20
21 public TestContext TestContext
22 {
23 get { return m_testContext; }
24 set { m_testContext = value; }
25 }
26
27 private TestContext m_testContext;
28 }
29 }
就像在基于表的数据驱动测试的情况下一样,指定为元数据的数据集将允许通过 TestContext.DataRow 进行检索。请注意,为了保持数据驱动测试的轻量,参数类型始终为 WEX::Common::String(在本机代码中)和 String(在托管代码中)
如果指定了多个数据值,将获取所有可能值的笛卡尔乘积,并且将为每个组合调用测试方法。
可以进一步让某些元数据集(如 ThreadingModel 元数据集)以及为同一测试方法指定的数据集。 在这种情况下,TAEF 将生成所有元数据集和数据集的组合扩展,并且涉及的测试方法将随每个组合一起调用。
特殊情况 - 使用一组元数据或数据进行数据驱动测试
可以具有依赖于基于表的数据驱动测试的测试方法,并为它指定一组数据或元数据。 例如,测试方法可以在基于表的数据驱动测试中指定参数“size”和“color”,并且希望所有行都执行一次,并将“transparency”参数设置为 true,然后设置为 false。 在这种情况下,可以将“透明度”指定为数据驱动测试的集“{true,false}”。 请务必注意,在元数据集基于数据驱动行的参数冲突的情况下,行级别参数类型和值将替代元数据集值。
使用数据集/元数据执行测试
包含数据集的测试的执行非常直观。 让我们看看示例测试的 /listproperties 输出:
1 te Examples\CPP.DataDriven.Example.dll /name:*SetsOfDataTest* /listproperties
2
3 Test Authoring and Execution Framework v2.9.3k for x64
4
5 f:\ Examples\CPP.SimpleDataDriven.Example.dll
6 WEX::TestExecution::Examples::SimpleDataDrivenExample<
7 WEX::TestExecution::Examples::SimpleDataDrivenExample::SetsOfDataTest#metadataSet0
8 Property[Data:Color] = {Purple, Maroon, Brown}
9
10 Data[Color] = Purple
11
12 WEX::TestExecution::Examples::SimpleDataDrivenExample::SetsOfDataTest#metadataSet1
13 Property[Data:Color] = {Purple, Maroon, Brown}
14
15 Data[Color] = Maroon
16
17 WEX::TestExecution::Examples::SimpleDataDrivenExample::SetsOfDataTest#metadataSet2
18 Property[Data:Color] = {Purple, Maroon, Brown}
19
20 Data[Color] = Brown
请注意上述示例中的第 7 行、12 行和 17 行。 元数据集索引将追加到测试方法的每个调用以及数据集中的值。 此索引采用以下形式:
<namespace qualified test method name>#metadataSet<metadataIndex>
第 8 行、13 行和第 18 行显示为此轻型数据驱动测试支持指定的元数据集。 在这种情况下,该集由紫色、马龙和棕色的颜色组成。 第 10 行、15 行和 20 行显示此集中的实际值,该值对于测试的当前调用处于活动状态。 对于 SetsOfMetadataTest#metadataSet1,此方法的第二次调用,则集中的活动参数值为“Maroon”
可以选择“数据”值或名称,就像在基于表的数据驱动测试中一样。 例如,可以通过选择查询(如 /select:@Data:Color='Maroon' 或 /name:*#metadataSet1)选择 SetsOfDataTest#metadataSet1
有关快速参考,托管测试示例中的 /listproperties 输出如下所示:
te Examples\CSharp.DataDriven.Example.dll /name:*SetsOfMetadataTest* /listproperties
Test Authoring and Execution Framework v2.9.3k for x64
f:\ Examples\CSharp.DataDrivenSimple.Example.dll
WEX.Examples.CSharpDataDrivenSimpleExample
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