现在的位置: 首页 > 综合 > 正文

RFT使用总结

2017年05月20日 ⁄ 综合 ⁄ 共 4812字 ⁄ 字号 评论关闭

转载地址:http://www.52testing.com/showart.asp?id=26


IBM Rational Functional Tester是由IBM推出的针对Java.NetWeb应用程序的自动化测试工具,拥有功能强大的编辑器并支持多种脚本语言,还集成了ScriptAssure
技术、模式匹配功能及数据驱动,以增强测试脚本的灵活性。借助这一工具,测试人员可以轻松地录制或编写脚本来进行自动化测试,极大地提高了测试效率。本文档就针对Studio的自动化脚本的录制来介绍RFT的使用。

1.      创建Functional Test项目

文件——新建——Functional Test项目,点击弹出创建Functionnal Test项目的对话框,在该窗口需要你指定项目名称和存放该项目的路径。点击【完成】按钮, Functional Test项目创建完成。

2.      编辑应用程序信息

配置——配置应用程序进行测试,点击弹出编辑用程序信息对话框,如下图所示。图1

在该窗口点击【添加】按钮,在弹出的“选择应用程序种类”窗口中选择“可执行文件或批处理文件”,然后点击【下一步】。

       在弹出的“选择可执行文件或批处理文件”窗口中,点击【浏览】,找到Studio的安装目录下的“start.bat”文件,然后点击【完成】,完成应用程序Studio的添加,再次点击【完成】,关闭“编辑应用程序信息”窗口。

3.      启用环境进行测试

配置——启用环境进行测试,点击弹出“启用环境”窗口,在该窗口中,选择“Eclipse平台”选项卡,然后点击【搜索】,弹出“搜索Eclipse平台”对话框,在该对话框中选择“在以下位置搜索”,然后点击【浏览】,找到Studio安装路径下的jee文件夹,点击【选择】,然后执行【搜索】,搜索完成后,“搜索Eclipse平台”对话框将自动关闭。

搜索完成后,在“启用环境”窗口中点击【启用】,然后点击【完成】,到此启用环境的配置完成。

4.      新建测试文件夹

为了方便管理,我们需要建立测试文件夹。选择我们刚才新建的Functionnal Test项目,右击选择“添加测试文件夹”,系统弹出“创建测试文件夹”对话框,在该窗口中,我们需要给这个测试文件夹指定一个名称,然后点击【完成】,则完成测试文件夹的创建。

5.      使用记录器录制脚本

以上工作完成以后,下面就可以进行脚本的录制了。

选择我们前面建立的测试文件夹,右击选择【添加空脚本】,系统将弹出“创建空的Functional Test脚本”对话框,在该对话框中,我们需要为要建立的脚本指定文件名称,然后点击【完成】,则完成空脚本的创建。

6.      将记录插入活动的Functional Test脚本。

双击打开我们前面建立的Functional Test空脚本,使其处于活动状态,然后将光标定位到方法publicvoid testMain(Object[] args)方法体中,然后点击工具栏上的图标,将记录插入活动的Functional
Test
脚本,开始脚本的录制。

7.      插入验证点

点击图标后,默认在屏幕的右下方将弹出脚本记录器窗口,如下图所示。

2

出现该窗口以后,便可以进行脚本的录制了,你所有的操作都会被RFT以脚本的形式的记录下来。

测试不仅仅是把你手工的操作让系统自动重新回放,更重要的是一些功能点的验证,比如设定一些预期值和实际值进行比较,这就需要用到验证点的帮助了。在脚本录制时,点击记录器上的图标来执行插入验证点的操作,此时,将弹出“验证点和操作向导”对话框窗口。

在该窗口中,点击手型对象查找器,然后将其拖放到待验证的位置(选中的地方将呈红色高亮显示),放开鼠标,系统将弹出“选择操作”对话框,在这儿,我们一般选择“执行数据验证点”选项即可,该操作为选中的测试对象验证数据,查看是否发生了任何有意或无意的更改。然后点击“下一步”,直至“完成”。到此,设置验证点完成。

8.      脚本回放

脚本录制完成后,便可以进行回放了。选择将要回放的脚本,右击选择【运行】,系统便会自动按照您刚才的的操作进行回放了。

 

 

第二篇对象识别的设置

脚本录制完成后一般都会弹出这样一个窗口,如下图:图3

在窗口的下方,选择“识别”选项卡,可以看到有三个属性:.class.title.url,它们是用来做什么的呢?我们前面已经提到过,Rational
Functional Tester
所使用的是ScriptAssure技术,该技术给各个界面元素赋予了一定的权重,再综合目标对象的各个属性得出一个量化的特征值,便于在对象之间进行比较,因此可以大大提高脚本对频繁变更的应用程序界面的弹性适应能力,ScriptAssure技术的原理并不难懂。对象在识别时,使用到3个属性:".class"".title"".url",权重各有不同。权重用来标识这个属性在识别过程中的重要程度,权重为100,表明这个属性非常关键,必须和原值完全一致;权重为0,表明这个属性是无关紧要的。识别分数就是在这些权重的基础上进行一定的运算而得到的。识别对象时,如果有一个权重100的属性值与原值不符,识别分数就要加上"权重×100",即10000分。在运行脚本结束时,有时给出这样的警告,如下图所示。

在上面的图片中,录制时使用的是打开的“百度”主页的IE页面,而回放时使用的是录制遗留下的搜索结果(即:浪潮首页)页面,导致".title"".url"这两项属性值不符,因此它的识别分数就是".title权重×100"再加上".url权重×100",一共是9000分+3000分=12000分,这就是警告信息里识别分数的由来。

至于警告信息里提到的"警告阈值",可以在Rational Functional Tester的“窗口——首选项——ScriptAssure——高级”窗口中进行修改,如下图。图4

警告阈值的缺省值是10000,表明有一个阈值为100的重要属性不匹配。“警告阈值”越小,则意味着识别过程越严格。在实际应用中可以根据具体情况做相应的调整。

第三篇设置合理的等待时间

脚本回放时,Java脚本是由Java虚拟机解释执行,进行速度很快;而浏览器的打开,页面的装入则往往由于机器性能、网络带宽、服务器负载而速度缓慢。如果被测程序的运行和脚本执行的时间差过大,极有可能导致测试的失败,因此等待时间是我们应该妥当设置的一个要素。等待时间的设置可以在“工具级”和“程序级”这两个层次上进行设置。

1)工具级的设置

Rational Functional Tester的“窗口——首选项——回放”,可以看到四项时间有关的回放设置,如下图所示。图5

缺省的“尝试查找测试对象的最长时间”值为20秒。由于此处设置比较简单,而且是一个对所有项目和脚本都有效的全局设置,因此很难设定一个能满足所有脚本的值。建议接受默认设置,不在这一层上做时间定制,而是去程序级进行更为灵活的控制。

2)程序级的设置

我们可以在程序级上,对脚本做适量的修改。在某些关键操作后加上适当的等待,直到该操作完全执行完毕,再继续之后的操作。“步步为营”地执行脚本,确保每一步的前提都是正确的。

脚本可以使用以下两种方式来添加等待时间:

2.1)定长等待

调用Java脚本的公共父类com.rational.test.ft.script.RationalTestScript里的方法:sleep(double seconds)。这一方法可以使回放过程等待若干秒。这种方式直观、简单。但缺点也是明显的:固定的时间常常不能适应多变的真实环境:等待时间设置得过长,无疑会拉长测试的回放时间,降低效率;等待时间设置得过短,在某些情况下,又无法起到延时应有的效果,仍然错过了被测对象。

2.2)不定长等待
脚本记录器记录下的页面对象都是从接口com.rational.test.ft.object.interfaces.TestObject继承下来的,在TestObject中有一个方法waitForExistence()可以用以实现不定长的等待。使用方法也很简单,“被等待的对象.
waitForExistence()
”,就OK了。调用该方法后,在一定的时间限度内,等待该对象的出现;一旦出现后就不再等待,程序继续往下执行。最大时间限度是在“窗口——首选项——回放”选项里设置的。不定长等待既达到灵活等待的目的,又没有浪费不必要的等待时间,建议在实际应用中使用该种时间等待方式。

第四篇参数化和数据池的使用

自动化测试是离不开开参数化的,要实现大批量的数据的录入或者实现某些需要输入参数的组件的重用,必须借助于参数化来实现。在RFT中,参数化是通过数据池来实现的,所谓数据池,从表面看就是一个存放数据的池子,然而实际上。它就是一个二维的关系表,和当今的流行的关系型数据库中的表基本上是一样的,可以对比着理解,如下图,便是一个创建表模型的数据池。图6

RFT中已经提供了很多现成的接口和类,通过这些接口和类可以很方便的对数据池中的数据进行读取。在一个测试流程中,可能包含很多的组件,而这些组件中又有很多需要参数化,而每一次的参数化都要初始化数据池,如果每一次参数化都从类的引用、声明、创建对象、调用相应的方法来执行,显然是不合适的,不仅是代码的冗余,维护性和可移植性也会相当的差,所以,为了避免上述的问题,我们需要建立一个工具类(Tools.java),将初始化数据池的操作写成一个方法放在这个工具类中,如下图便是抽取出的初始化数据池的方法:

IDatapoolIterator initPool(String fileName)。图7

由上图可以看出,该方法是一个静态(static)的方法,无需创建对象,通过类名就可以直接调用。另外,这个方法包含有一个输入参数fileName(数据池文件名),这样,当某个测试类需要初始化数据池的时候,提供自己的数据池文件名,就可以直接调用这个工具类的方法。在工具类Toos.java中,还声明了一个String类型的静态的变量path,它便是数据池文件存放的绝对路径,在initPoolString
filename
)方法中引用了该变量,通过该变量与传入的参数(数据池文件名)的拼接,形成了当前数据池的完整的存放路径,这样当数据池文件路径改变时,只需要修改一处就行了,从而很好的实现了脚本代码的重用性和可维护性。

下面来看一下,在测试脚本中是如何调用这个初始化数据池的方法的。图

上面这段代码实现了从数据池中动态的读取参数来创建数据表模型,可以看到:IDatapoolIterator dpitr=Tools.initPool("创建表模型Pool");直接调用了工具类Tools中的initPool()方法,进而通过游标的移动来实现读取不同行的值。

当游标定位到某一行的时候,读取该行的某个单元格(cell)的值有两种方式,第一种是通过索引来定位,如getCell(1).getStringValue(),在getCell(int
n)方法中的n从0开始计数,0表示第一个单元格的值,1表示第二个,以此类推。另一种方法是通过该单元格所在列的字段名(也称变量名)来取值。如dprec.getCell("中文描述").getStringValue(),其中,"中文描述"就是数据池中单元格所在列的字段名。两种方法各有优缺点,在使用时,可以根据具体情况来选择。

第五篇总结

通过对RFT的短暂的使用,可以说对这个新型的测试工具的了解还很肤浅,仅限于入门级的使用,现将自己的一些使用心得汇总成文档,或许对大家以后对于RFT的学习能够提供些许的帮助,鉴于自己对RFT的了解还不够深入,文档中难免有不足或遗漏之处,还请大家指出为盼,以期共同提高、共同进步!

抱歉!评论已关闭.