在 IBM Rational Functional TesterRFT 中开发健壮的 Web 应用功能测试脚本.docx

上传人:b****6 文档编号:7726013 上传时间:2023-01-26 格式:DOCX 页数:11 大小:290.44KB
下载 相关 举报
在 IBM Rational Functional TesterRFT 中开发健壮的 Web 应用功能测试脚本.docx_第1页
第1页 / 共11页
在 IBM Rational Functional TesterRFT 中开发健壮的 Web 应用功能测试脚本.docx_第2页
第2页 / 共11页
在 IBM Rational Functional TesterRFT 中开发健壮的 Web 应用功能测试脚本.docx_第3页
第3页 / 共11页
在 IBM Rational Functional TesterRFT 中开发健壮的 Web 应用功能测试脚本.docx_第4页
第4页 / 共11页
在 IBM Rational Functional TesterRFT 中开发健壮的 Web 应用功能测试脚本.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

在 IBM Rational Functional TesterRFT 中开发健壮的 Web 应用功能测试脚本.docx

《在 IBM Rational Functional TesterRFT 中开发健壮的 Web 应用功能测试脚本.docx》由会员分享,可在线阅读,更多相关《在 IBM Rational Functional TesterRFT 中开发健壮的 Web 应用功能测试脚本.docx(11页珍藏版)》请在冰豆网上搜索。

在 IBM Rational Functional TesterRFT 中开发健壮的 Web 应用功能测试脚本.docx

在IBMRationalFunctionalTesterRFT中开发健壮的Web应用功能测试脚本

在IBMRationalFunctionalTester中开发健壮的Web应用功能测试脚本

简介:

 本文重点针对网络应用,尤其是基于JavaEE开发的企业级应用,讨论利用RationalFunctionalTester(RFT)编写健壮的自动化功能测试脚本的最佳实践。

引言

IBM®Rational®FunctionalTester(简称RFT)是一款面向对象的自动化测试工具,测试人员应用此工具可以对多种应用程序进行功能测试、回归测试、数据驱动测试以及GUI测试。

它不仅支持Siebel和SAP的扩展,同时支持对使用多种浏览器,如MozillaFire-fox、IE等的HTML应用进行测试。

本文重点针对网络应用,尤其是基于JavaEE开发的企业级应用,讨论利用RFT编写健壮的自动化功能测试脚本的最佳实践。

针对网络应用的自动化功能测试,通常在回放过程中,由于录制与回放使用浏览器的不同而造成测试的失败;而对于同一浏览器进行录制与回放,也会因为数据或者页面对象属性的变化而造成测试的失败。

本文主要针对开发JavaEE应用自动化测试脚本问题,如:

浏览器变化、测试数据变化、测试对象属性变化等问题进行讨论,同时提供相应的解决方案,目的在于通过这些最佳实践,能够更好的开发健壮的自动化功能测试脚本。

本文主要讨论以下三个主题:

1.创建灵活的功能测试脚本以适配浏览器对HTML元素的处理

2.创建基于数据接口的功能测试脚本以响应测试数据的变化

3.创建优化的对象识别功能测试脚本以支持页面测试对象的变化

创建灵活的功能测试脚本以适配浏览器对HTML元素的处理

对于实际的web应用功能测试,常常会碰到脚本回放中在浏览器端出现错误的场景。

由于不同浏览器或者浏览器的不同版本对于HTML元素处理方式不同,因此这可能会导致脚本不能平滑的进行回放,甚至导致失败。

下文针对此问题,举出三种常见的现象,并提供相应的解决办法。

查找和关闭弹出的浏览器实例窗口

当浏览器的JavaScript脚本被打开时,新的浏览器窗口可以通过以下JavaScript代码片断弹出:

清单1.打开新浏览器窗口

onclick="Javascript:

popupWindow('false"

网络应用经常显示一些辅助页面来帮助客户自如地使用软件产品,这些辅助页面通常是通过使用上述的JavaScript代码而弹出的。

当点击该链接后,新的浏览器实例被创建并且浏览器窗口显示出来,其中包含了指定目标URL中的内容。

然而,如果功能测试脚本编写不当,RFT回放监控器有可能不能很好地区别这两个浏览器窗口实例,并因多个浏览器的实例被识别从而引发脚本执行错误,即脚本方法browser_htmlBrowser()调用失败,该方法本身不带任何参数,是由RFT自身在录制脚本时自动创建的浏览器实例查找方法。

解决这类问题最有效的办法是动态查找正确的浏览器窗口实例。

实现如下,调用getRootTestObject().find()方法并且指定‘Html.HtmlBrowser’作为被查找节点的‘.class’属性值。

清单2.动态查找正确的浏览器窗口实例

TestObjectobjects[]=getRootTestObject().find(

atDescendant(".class","Html.HtmlBrowser"));

//TraversaleveryTopObjectgetdocumentobject

if(((String)document.getProperty(".title"))

.equalsIgnoreCase(“myPageTitle”){

((BrowserTestObject)objects[i]).close();

}

示例代码返回一个TestObject测试对象列表,实际上是一组浏览器窗口实例,然后通过检查这组浏览器实例的一些特定属性值比如”.title”来识别某个确切的浏览器窗口实例。

识别折行的HTML链接

对一个折行的HTML链接,在某些浏览器中运行功能测试脚本时调用该链接的click()方法可能出错。

图1.跨多行的HTML链接

在上图1中,HTML链接“Softwaredownload&mediaaccess”折行,也就是说链接文本在两行间分散开并且围绕着该链接形成了如图所示的红色矩形区域。

当RFT在某些浏览器中回放测试脚本时,回放监控器会默认地直接点击围绕链接最小区域的中心,不巧的是上图的场景中某些浏览器认为该中心点是空的并且不可点击操作的,于是RFT就可能抛出Java的UnsupportedActionException异常。

对上面问题最简单的解决办法就是为RFT回放监控器指定一个非空的屏幕点去点击。

清单3.为RFT回放监控器指定一个非空的屏幕点

intoffset=link.getScreenRectangle().height/4;

link.click(newPoint(0,link.getScreenRectangle().height-off-set));

在如上所示示例代码中,指定的RFT回放监控器点击的点位于围绕链接的矩形区域的左下角。

这就告诉了回放监控器点击的点X坐标为0,Y坐标为链接的高度减去一个固定的位移,这个位移刚好为链接高度的四分之一。

这个点不为空,所以RFT回放监控器就能成功地点击。

本文建议读者为网络应用创建自动化功能测试脚本时,如果需要在浏览器中执行点击HTML链接的操作,都可以应用这个解决办法。

为文本输入域设置值的小技巧

在某些版本的浏览器中,如果文本输入框不能获得鼠标焦点,则当RFT回放测试脚本时,文本输入框上textGuiTestObject.setText(text)方法的执行就会失败。

也就是说,在为文本输入域设置值之前,光标必须设定在当前输入框上,否则测试脚本回放失败。

为解决这个问题,脚本可以先调用文本输入框的textGuiTestObject.click()方法将光标焦点置于文本输入框上,然后再调用textGuiTestObject.setText()方法设置文本值。

请参考下面的实现代码片断:

清单4.设置文本值

text_username(getTestObject(),DEFAULT).click();

text_username(getTestObject(),DEFAULT).setText(“myUserName”);

另外,在录制测试脚本时,文本输入框的值需要直接键入而不能通过剪贴板拷贝粘贴,否则文本的值依赖于每次运行脚本时剪贴板的内容。

剪贴板的内容总是随着用户的复制操作而变化的,这是不固定的,并且很容易导致功能测试脚本执行失败。

创建基于数据接口的功能测试脚本以响应测试数据的变化

一个完整的RFT录制与回放的工程,通常主要由三部分组成:

记录的逻辑操作、记录的页面对象元素以及记录的页面数据。

在回放过程中,这三个部分都不可缺少,同时页面的逻辑、对象和数据都不能更新,任何一个部分的变化都可能导致脚本回放的失败。

数据的变化是最常发生的情况,其中测试数据的变化主要包括由于页面输入数据的改变、业务逻辑数据的变化(数据库中数据的变化等)以及环境数据的变化(多语言改变)等。

测试脚本中常见测试数据定义

针对测试数据的使用和保存,在RTF中主要有以下两种方式:

(1)测试数据直接存在于测试脚本中。

如图2所示,测试数据被包含在测试脚本中,这种情况多出现于在页面中直接填写数据,在录制过程中数据就直接被记录在脚本中。

这是最基本的测试数据记录方式,但如果测试数据需要改变,那么这种方式就显得不够灵活,甚至会造成脚本回放的失败。

图2.数据存在于测试脚本中

(2)利用外部数据(DataPool)做数据驱动。

如图3所示,为了灵活的对数据进行操作和更改,RFT使用DataPool来管理测试数据,即将测试数据与测试脚本分离,利用DataPool来驱动测试脚本,从而使测试脚本的灵活性大大增强。

但DataPool的设计和使用可能对一些复杂的测试场景有一定的局限性,在数据准备上相对繁琐,如果遇到大量数据的变化(数据库中数据的变化)问题时,DataPool对测试脚本的驱动效果就可能不是十分理想。

图3.数据驱动测试脚本

数据接口的实现

数据库接口的实现

在测试脚本中,对于所记录的页面输入数据、需要验证的信息数据都有可能来自于数据库。

在不同的时刻,有可能数据库中的数据会发生相应的变化,导致脚本在回放时,所填写的数据不符合此时逻辑要求,或者原先的验证点不能成功被验证。

在一个RFT工程中,主要有以下几种记录数据的文件类型:

∙DataPool(数据池):

以表格的形式将数据存放,并在脚本运行之前,根据所需要的数据,选择相应的DataPool文件。

DataPool文件是在回放脚本前需要准备好的。

∙Script(测试脚本):

测试脚本本身,这里会包含直接与页面展示相关的数据,这些数据多数来源于页面的输入,或者是后台经过数据库查询后数据展示在页面中。

数据库接口多数应用在与测试脚本直接交互方面,如图4所示。

针对这样的问题,可以将应用中关于数据查询的部分作为接口,注入到测试脚本中。

将原先脚本中记录数据的地方,用相应的查询方法所替代。

这样以来,测试脚本中的数据能够更加灵活的进行变化,并且对于不同测试环境和连接不同的数据库来说,也可以按实际要求进行切换,以使测试脚本顺利的进行回放和复用。

图4.数据库接口注入测试脚本

多语言接口的实现

RFT为了测试脚本支持国际化,提供了内置的对象识别机制来从本地化的属性文件中读取测试对象的属性值。

但是这得在RFT启动时打开这个功能,一旦该功能打开,RFT在回放测试脚本时就会将测试对象的属性值作为在属性定义文件中所使用的Key,通过这个Key在属性文件中找到对应的属性真正的被本地化的值。

在RFT安装目录里,找到配置文件ivory.properties,将其中的rational.test.ft.services.enable_localization值设置为“true”从而将本地化支持功能打开。

ivory.properties文件一般位于RFT安装目录下的子目录bin中。

将测试脚本中使用的文本本地化后的属性文件放置在测试工程resources目录中(如图5所示),并且属性文件的基本名字和项目工程的名字一样,但是后面拼接上相应的Locale。

图5.属性文件位于项目工程resources目录下

清单5.属性文件

#Englishproperties

docTitle=“DemoProject”#Andotherpropertiesdefinitionhere

更新RFT测试对象映射中测试对象的属性(比如.title)为本地化后的属性文件中的Key,并且在属性文件中定义该Key的本地化Value值,如图6所示。

图6.使用本地化属性文件中的Key作为属性值

于是RFT在回放功能测试脚本时就会从项目工程下resources目录中读取被本地化好的属性的Value值,这些属性值根据Locale的不同会有不同的翻译。

创建优化对象识别功能测试脚本以支持页面测试对象的变化

RFT在对页面进行功能测试脚本录制的同时,也会记录页面上对象的标识信息,以便在脚本回放的过程中,根据已记录的信息进行对象的识别和相应的操作,能够使得测试脚本顺利执行。

以下根据RFT对于页面对象的识别原理和常见识别方法,借助RFT的可扩展性,提供几种灵活的对象识别方法,使得对象识别方法更智能、准确。

RFT对HTML中对象的识别原理

对于被测页面中的HTML对象的识别,RFT提供了专门的Proxy进行处理,并将其转换成测试脚本。

其中RFT中定义TestObject为识别测试对象的基类,测试对象则被映射为GuiTestObject对象。

对于测试对象来说,每一个对象都有自己唯一的属性,从而能够在脚本回放的过程中被准确的识别,同时这些测试对象的属性也在录制的过程总被存储在工程中。

以图7的google主页的搜索按钮为例,用RFT的TestObjectInspector工具进行页面对象识别时,会出现以下内容,如图9所示。

可以看出两个测试对象中“.name”的属性值是完全相同的,但是通过“.class”的属性来唯一区分两个不同的测试对象。

测试脚本在回放时,也是按照这个原理来准确识别测试对象,从而使得脚本能够顺利运行。

图7.google主页搜索按钮

图8.google主页搜索按钮属性

同时在工程的resources文件夹里,生成后缀名为”.rftdef”和”.rftxmap”两个文件,这两个文件记录了测试对象的属性,两个文件的相关内容通过后缀名为”.rftdef”的文件中的id相关联。

以图8中的搜索按钮上的文本为例。

“rftmap”文件

1.1LspE2Ef1EHB:

SV5q3:

MzptfHo:

8WR

Google搜索<

SimpleName>Google搜索

0.1LspE2Ef1EHB:

SV5q3:

MzptfHo:

8WR

GuiSubitemTestObject

Win

.Text

Text

.Win.GenericProxy

.name

Google搜索

75

“.rftxdef”文件

google搜索text

1.1LspE2Ef1EHB:

SV5q3:

MzptfHo:

8WR

Text

false

灵活定义识别测试对象方法

调整权重设定对象属性的重要性

RFT测试脚本在测试对象映射中定义了所有测试对象。

每个测试对象的属性都有一个额外的属性权值,用以表示这个属性在识别对象时的重要性。

RFT计算所有属性的权值,通过权值决定该测试对象是否是用户期望的HTML元素,也就是说对象属性是否匹配设定的查找条件。

例如,下面的测试对象映射录制在c:

\DEMO\Project1.html下,然后使用在Project2.html中,这个URL和Project1.html类似,只是在Project名称上有细微的差异。

然而,既然URL和最开始录制的不完全一样,这个HTML链接就不能在项目2中匹配上。

简单的解决办法是在测试对象映射中减小链接URL的”.href”属性权值。

比如将”.href”属性权值降到更低的20让RFT在识别测试对象时不将该属性作为重要属性。

所以测试对象查找方法就能够基于其它主要属性比如”.text”和”.name”识别该测试对象。

图9.测试对象的属性定义

对有细微差异的属性值使用正则表达式

RFT测试脚本也可以使用基于模式的对象识别,这允许更大的灵活性。

正则表达式的使用可以忽略被测应用新版本发布中引入的细微差别,而不需要经常根据版本不同频繁更新已经存在的功能测试脚本。

这不仅可以应用于测试对象映射中的属性值,而且还可以用于TestObject.find()方法来有效查找目标对象。

为了识别上例中正确的链接,”.find”查找方法可以接收一个正则表达式作为输入参数。

尽管”.href”属性经常变化,但这仍然可以有效地运用。

在对象识别时为了匹配正确的链接,为URL属性设置一个正则表达式参数,比如:

“C:

\\\\DEMO\\\\Project[12].html”,”.find”方法就会返回正确的目标链接。

清单6.返回正确的目标链接

StringlinkHref="C:

\\\\DEMO\\\\Project[12].html";

TestObject[]links=getHtmlBrowser(getTestObject(),DEFAULT).find(

atChild(".href",linkHref));

通常说来该方法是解决此类在版本间处理细微差别问题最有效的方法,并且这些细微差别大多是文本属性的改动。

为查找测试对象方法传入特定的父对象

对象查找方法非常有用,通过使用自定义查找方法,自动测试脚本便易于维护。

在使用查找方法时传入父对象作为参数,可以限制查找方法只在父对象所属的容器中完成。

虽然测试对象有了细微的变化,指定一个合适的父对象不仅能够缩小查找范围同时能够节省查找时间,对已有脚本的唯一更改是直接使用更改后的测试对象,而没有必要重新录制未更改的测试对象。

清单7.对象查找方法

protectedBrowserTestObjectgetHtmlBrowser(TestObjectanchor,longflags){

returnbrowser_htmlBrowser(anchor,flags);

}

//Inthesuperhelperclass,theanchorwillbeusedtogetthetestobject.

protectedBrowserTestObjectbrowser_htmlBrowser(TestObjectanchor,longflags){

returnnewBrowserTestObject(

getMappedTestObject("browser_htmlBrowser"),anchor,flags);

}

这使得处理新的版本发布引入的细微差异非常容易,也不需要很大的代码改动。

结论

本文所提及的内容都是来自于平常工作的最佳实践。

通过对RFT功能测试脚本的编写以及对RFT扩展功能的使用,可以使自动化功能测试脚本更加的灵活,同时对录制的脚本的维护更加方便。

本文描述的最佳实践可以帮助测试人员和开发者在IBM®Rational®FunctionalTester创建健壮的功能测试脚本。

但是并不保证这些最佳实践能够解决读者所面临的所有问题,读者在决定使用自定义脚本还是录制脚本时请参考更多的官方文档。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 职业教育 > 中职中专

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1