关闭

灵活使用 RFT 数据池迭代器实现数据驱动测试

发表于:2007-10-15 17:24

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:魏可伟    来源:网络转载

对数据驱动测试的支持是 Rational Functional Tester(RFT)的重要特性之一。可是另一方面,RFT 所提供的数据池访问方式相对单一,限制了对用户实现较为复杂的测试策略的可能性。本文介绍了如何使用顺序迭代器之外的迭代器灵活访问 RFT 数据池的方法,并提供自定义迭代器供用户实现不同的数据选择策略。

1. RFT 与数据驱动测试

  数据驱动测试是一项单个脚本使用不同的输入和响应数据重复执行的技术。在数据驱动测试中,自动化测试脚本使用从外部数据源中读取的变量,而不是直接使用文字值(Literal value)。数据驱动测试的优势在于其将数据与测试脚本分离,从而可以在不修改测试脚本的情况下通过更新测试数据完成对测试用例的增加、更改和删除。


图 1: 将数据硬编码到脚本中的测试方式
 将数据硬编码到脚本中的测试方式

图 2: 使用外部数据源的数据驱动测试
 使用外部数据源的数据驱动测试

  RFT 中通常使用数据池(Datapool)作为数据驱动测试的数据源。数据池是一系列数据记录的集合。这些记录作为测试脚本回放时的变量输入。RFT 数据池为表格结构(Tabular)。要创建数据池,用户可以通过 RFT 所提供的数据池编辑器直接操作,也可以从 Excel 或者 Rational Test Manager 中导入数据。数据池建立后,将其与 RFT 的测试脚本相关联,被关联的测试脚本就可以通过迭代器读取数据池的记录,从而实现数据驱动测试了。

2. 实例分析——数据驱动测试

  为了更好的说明如何使用 RFT 的迭代器,下面我们给出了一个例子。在这个例子中,待验证的是一个计算器程序 Calculator,该程序提供 cal 方法:

public double cal(String expression);

cal 方法接受一个算术表达式作为输入,并返回该表达式的结果。

  为了验证该方法,我们设计了分别包含加减乘除运算的表达式作为输入的测试用例。这些用例对应的数据池如图 3。数据池的第一列为测试用例的名称,同时也是数据记录的标识,第二列为输入的表达式,第三列则为预期的结果。

  通过这个例子我们可以更好的理解数据驱动测试。基于不同的数据输入,我们可以验证待测试程序是否对各种类型的运算都能给出正确的结果。当需要增加测试用例时(比如增加覆盖括号运算的测试用例),我们不需要更改原测试脚本,只需要在数据池中增加一条新的记录即可。在后面的章节中我们会以此为例介绍使用不同的迭代方式来实现不同数据选择策略的数据驱动测试。


图 3: 为验证计算器程序而设计的数据池
 为验证计算器程序而设计的数据池

3. RFT 默认支持的迭代器——顺序迭代访问和随机迭代访问

  数据池是数据记录的集合,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 项目的构建路径。

21/212>
《2023软件测试行业现状调查报告》独家发布~

精彩评论

  • wangjie_hdu
    2011-4-18 21:42:48

    代码不能完全显示出来!

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号