数据池是数据记录的集合,RFT 是通过迭代器对数据池进行访问的。不同的迭代器访问数据池的方式又都有所不同。其中,顺序迭代器(SequentialIterator)和随机迭代器(RandomIterator)是 RFT 所默认支持的,它们提供了最基本的数据池访问方法。无论是顺序迭代器,还是随机迭代器,都迭代数据池中的全部数据记录。他们的区别在于顺序迭代器按照数据记录在数据池中出现的顺序迭代访问,而随机迭代器则采用随机顺序迭代访问。
RFT 提供创建脚本向导设置数据池的访问方式。在向导中,RFT 提供上述两种迭代器给用户选择。
3.1 顺序迭代访问
我们首先介绍如何通过创建脚本向导建立一个顺序访问数据池的测试用例。在创建一个 RFT 测试脚本时,该向导允许用户选择要关联的数据池和数据池中记录的访问顺序(Datapool Record Selection Order),即选择何种迭代器。
图 4: 通过创建脚本向导选择迭代器
除了在脚本创建时指定关联的数据池和迭代器,在脚本创建以后,用户还可以在脚本浏览器(Script Explorer)中重新关联脚本到其他数据池,如图 5 所示。
图 5: 关联测试脚本和数据池
在将测试脚本与数据池关联后,就可以在脚本中实现对数据池的迭代访问了。在下面的实例代码中,迭代器的类型是在创建脚本向导中指定的,因而无需在脚本中显示声明。(已创建的脚本可以在脚本对应的 RFT 定义文件中查看迭代器类型,RFT 定义文件后缀名为 rftdef)。
列表 1: 使用顺序迭代器实现数据驱动测试
public class SequentialIteratorDemo extends SequentialIteratorDemoHelper { public void testMain(Object[] args) { // 初始化计算器程序 Calculator calculator = new Calculator(); // 为数据池中每一条记录运行测试 while (!dpDone()) { // 读取测试用例名称 String testcase = dpString("Testcase"); // 读取期待结果 Double expected = new Double(dpDouble("Result")); // 读取表达式并计算实际结果 Double actual = new Double(calculator.cal(dpString("Expression"))); // 利用手动验证点进行验证 vpManual("VP_" + testcase, expected, actual).performTest(); // 处理下一个测试用例 dpNext(); } } } |
在这个例子中,测试数据记录被访问的顺序是 Cal1,Cal2,Cal3,Cal4,Cal5,和在数据池中定义的顺序相同。
3.2 随机迭代访问
上面我们介绍了顺序迭代访问,这也是最简单的数据迭代方式。如果数据池中数据记录在顺序上的关联性会对测试结果产生影响时,另一种迭代方式——随机迭代访问就更加合适。因为在上一小节我们使用脚本创建向导选择了迭代器,在本小节我们介绍另一种指定迭代器的方法——用显式声明的方法使用随机迭代器访问数据池。该方法需要显式调用迭代器的构造函数,并通过 dpInitialize() 方法将迭代器与数据池关联起来。
列表 2: 显式调用随机迭代器访问数据池(请注意斜体标出的部分)
public class RandomIteratorDemo extends RandomIteratorDemoHelper { public void testMain(Object[] args) { // 初始化计算器程序 Calculator calculator = new Calculator(); //初始化随机迭代器RandomIterator iter = new RandomIterator();//将其与数据池关联iter.dpInitialize(getDatapool());// 为数据池中每一条记录运行测试 while (!iter.dpDone()) { // 读取测试用例名称 String testcase =iter.dpString("Testcase"); // 读取期待结果 Double expected = new Double(iter.dpDouble("Result")); // 读取表达式并计算实际结果 Double actual = new Double(calculator.cal(iter.dpString("Expression"))); // 利用手动验证点进行验证 vpManual("VP_" + testcase, expected, actual).performTest(); // 处理下一个测试用例iter.dpNext(); } } } |
在这个例子中,测试数据记录被访问的顺序是不确定的,其中一种可能是 Cal2,Cal3,Cal5,Cal1,Cal4。
4. 选择合适的数据池访问方式
RFT 默认支持的顺序迭代器和随机迭代器提供了数据驱动的基本支持,可无论使用哪种迭代器,数据池中的所有记录都会被访问到。在实际的测试,特别是回归测试过程中,为了提高测试脚本运行的效率,测试人员会制定不同的数据选择策略来执行数据驱动的测试用例。比如,在一次测试执行过后,只选择在本次执行中失败了测试用例对应的数据记录在下一次运行中执行。又如,在每个回归测试周期只选择数据池中的一部分数据进行测试。顺序迭代器和随机迭代器都无法满足这种要求,需要有更为灵活的迭代器才能支持这种数据选择策略。
笔者在这里介绍三种自定义的迭代器,他们分别用于不同的场景,可以满足不同的数据选择策略的需求。要使用这三种迭代器,请首先将附件中的库文件 rftIter.jar 加入您 RFT 项目的构建路径。
文章来源于领测软件测试网 https://www.ltesting.net/