求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Modeler   Code  
会员   
 
  
 
 
 
RFT ScriptAssure 技术解析及应用实例
 

2010-10-13 作者:章国俊 来源:IBM

 

内容

简介: 本文由自动化测试中的脚本独立性谈起,深入介绍 Rational Functional Tester(RFT)中所提供的高级特性 ScriptAssure,看它是如何均衡脚本的可靠性和可维护性。文中实例可以帮助读者实践不同模式下的回放过程,增加对 ScriptAssure 技术的感性认识。

缘起:脚本独立性和脚本依赖性

在引入正题之前,让我们先了解一下自动化测试中的脚本独立性和脚本依赖性。自动化测试脚本的依赖性,是指在某些情况下,一个测试脚本必须依赖另一个测试脚本来完成一些关键性的工作。通常我们把这些依赖性分为两类:因为等待某些应用程序数据而依赖其他脚本,或因为等待某些应用程序状态而依赖其他脚本。

数据依赖
脚本的应用程序数据依赖于其他脚本来创建或维护。
状态依赖
脚本的应用程序起始状态依赖于其他一些脚本来导航和控制。这些脚本不启动应用程序,而是在应用程序中间某处开始执行。

通常情况下,执行顺序对于依赖性脚本非常重要。依赖性脚本仰仗于之前的程序数据或程序状态的变化,那些被依赖的脚本必须在它们之前以特定顺序运行。如果它们的运行顺序有变,脚本将极有因为数据丢失或错误数据而失败。“测试脚本的独立性”并不完全是“脚本的依赖性”的对立面,但很接近。脚本独立性是指您的脚本都完全可以自给自足。测试脚本不需要依赖其他脚本来完成一些必要的工作。通常情况下,脚本独立性使得执行顺序并不重要,任一脚本都可以在任意时间执行。

在这一点上,独立的测试脚本似乎是一项明智的选择,那么为什么还要有依赖性的脚本存在?通常,脚本依赖性可以提升模块化程度,减少脚本的代码量(由于代码重用率较高)。这往往导致对代码维护的成本降低,因为有代码重用后总量更少了。例如,假设您只有一个登录门户的脚本,其他所有脚本都必须依赖于它登录到应用程序。在这种情况下,如果登录界面更改或登陆流程发生变化,你只需要更新一个脚本(而非所有涉及到登录的脚本)。

这又引来了对于自动化测试里记录和回放模式的一个经典的争论:脚本的独立性越高,就意味着你受应用程序的牵制越多,增加了程序维护的成本;而脚本依赖性则是试图减少开支。通过共享应用程序数据来降低测试案例数目,通过共享应用程序状态及模块化帮助你得到更健壮的测试案例。一言以蔽之,脚本的依赖性,会有助于降低代码量及维护成本。

当然,另一方面,脚本依赖性也不是十全十美的。依赖性脚本会导致阻塞性的错误。这种阻塞问题往往是一个产品缺陷,但它在被修复前会阻碍之后所有相关任务的执行,这会形成自动化测试和脚本的瓶颈。有了依赖性后,如果第一个脚本失败,该脚本之后的所有脚本都有可能失败。而且有了脚本依赖性,应用程序状态和数据共享也成为一个问题,数据共享和程序状态共享会使得脚本更为复杂,开发人员很难定位出错原因,这会严重影响可靠性。一般来说,独立的测试脚本此时则显得更为可靠。

从下图可以看出,随着脚本可靠性的增加,它的可维护性会必然下降,两者相互牵制。

图 1. 脚本的可维护性和可靠性
图 1. 脚本的可维护性和可靠性

这是我们在进行自动化测试的策略制定、规划及开发过程中必须要做出的抉择,与此同时,我们也积累了很多办法来在这两者间取得一个最佳的平衡,让可靠的独立性脚本更加易于维护,或让强依赖性脚本变得更加可靠。本文要介绍的 Rational Functional Tester 中所应用的 ScriptAssure 技术就是其中的佼佼者。

什么是 ScriptAssure

ScriptAssure 目前为 IBM 的专有技术,通过对用户界面细节的识别阈值的定制,来实现了一种先进的查找最合理候选对象的匹配机制,使得脚本的维护工作不再囿于界面的频繁改动,变得更加轻松。稍后我们会通过一些实例来详细了解这项技术的精髓。

ScriptAssure 技术降低了脚本独立性的实现成本

“录制和回放”模式是脚本独立性的最常见的实现模型。不论你是否反感“录制和回放”,它在测试工具演化历史里都有它的一席之地。人们不喜欢它主要是因为随着使用时间的延长,脚本很难维护。这种缺陷也是其他独立性较强的测试脚本的通病:你的脚本越多,你就要投入更多的时间和精力来维护他们。因为脚本间相互独立,如果你有 100 个脚本,一旦某个基本的相关对象发生变化,需要对 100 个脚本一一做出对应修改。

而 ScriptAssure 是一组 Rational Functional Tester 中为功能测试和回归测试而提供的高级特性,它可以帮助你显著降低在脚本维护上的投入。通常情况下,某个用户界面上对象的细小变化都会打断自动测试的顺利执行。为了使脚本更加的灵活、健壮,ScriptAssure 技术将界面部件的功能从对象本身剥离开来。作为脚本设计人员,他可以对界面对象的颜色、位置、逻辑名称等特性设定权重,这些权重告诉 ScriptAssure 在寻找匹配对象时是否需要取舍这些特性的变化。对于低权重的特性,即使它们发生了变化,这些变化也会被脚本在一定程度上忽略,保障原先的脚本可以具有一定的容错性,在变化后的界面里继续工作,这大大降低了维护成本。而且还使测试人员在用户界面设计没有完全确定前,就可以开展前期测试。

ScriptAssure 技术可用来验证应用程序中的变动数据

如果被测应用程序里会有很多动态生成的数据,如零件编号或确认码,这可能需要测试人员进行乏味的人工干预来保障测试运行。 ScriptAssure 支持对动态数据进行自动化测试,消除了不必要的人力介入,测试人员能够轻松地验证动态生成的内容验证工作。有了 ScriptAssure,测试人员可以设置一个可接受的测试集的数据范围,施行自动化测试。

Rational Functional Tester 中的 ScriptAssure

Rational Functional Tester 中的 ScriptAssure 提供了一种很灵活的对象查找和匹配机制,使得被测应用程序发生变化后,您仍然可以成功地回放同一脚本。

脚本在录制时,测试对象图也随之更新,来储存相关控件。测试对象图里的每个对象都有着对应的一组可识别属性,这些通常都是在录制时保存下来的。例如,一个按钮会有 5 个可识别属性:名称、类型、角色、对象类别和索引。在回放过程中要定位被测应用程序里的一个对象,Rational Functional Tester 会将这个对象与测试对象图里预先储存的可识别属性做比较,来确定某个属性最接近的候选者。同时,每一个测试对象的可识别属性还有一个关联权重,数值从 0 到 100。Rational Functional Tester 使用这个权重值来确定可识别属性的重要性。例如,按钮的名称、类型、角色,及对象类别的识别权重是 100,但索引的权重却只有 50。

图 2. 测试对象图里保存的可识别属性,及权重信息
图 2. 测试对象图里保存的可识别属性,及权重信息

Rational Functional Tester 在识别被测应用程序里的对象时,要求该对象属性必需和对象图中事先保存的属性一致。默认情况下,Rational Functional Tester 最多可以容忍有 1 个或 2 个属性值出现偏差。如果有 2 个属性值不能和对象图内容相匹配,Rational Functional Tester 会在结果报告里记下一个“弱识别”警告,如果有 2 个以上的属性值不符,Rational Functional Tester 就无法找到目标对象了。

如果被测应用程序的对象发生了改变,您仍然可以回放功能测试脚本,这归功于脚本使用了 ScriptAssure 技术来控制对象匹配的敏感度。稍后我们还有实例来阐述。

在 Rational Functional Tester 中您可以打开“窗口”菜单里的“首选项”,使用两种模式来配置 ScriptAssure:

  • 标准模式

ScriptAssure 标准模式,您可以使用滑块控制在回放时的匹配灵敏度。要设置在应用程序对象之间的识别宽容度,可以在“严格”和“宽松”间调整滑块来设置识别水平。同时也可以设置警告级别,一旦出现识别差异后,应如何处理,在结果报告里抛出警告或者忽略。

图 3. ScriptAssure 标准模式
图 3. ScriptAssure 标准模式
  • 高级模式

在 ScriptAssure 页的高级模式下(点击上图的“高级”按钮后),可以设置识别分数的阈值,更加细致地来控制 ScriptAssure 的应用。可以设置一个最高分,来决定是否接受该候选对象;如果候选对象和原先定义间识别分数大于阈值,则被视为不可接受。

图 4. ScriptAssure 高级模式
图 4. ScriptAssure 高级模式

Rational Functional Tester 用以下算法来计算被测应用程序里对象的识别分数。例如,如果某对象和对象图里的属性值完全匹配,其得分为 0。如果目标对象有一个权重为 100 的属性不相符,它的评分是:

Σ(不相符属性的权重 *100) = 100*100 = 10,000。如果对象有两个权重 100 的属性不匹配,它的评分是 20,000。识别分值越高,表明差异越大、匹配越不精确,识别分值喻示着不匹配的程度,我们在测试时还是希望识别分值越小越好。

您可以自行设定识别分数的阈值,比如接受承认的最大分值的阈值,最后一次机会识别分值,模糊识别分数偏差的阈值,并且如果我们接受了大于阈值的分数会发出警告。在回放过程中,测试对象所有属性的识别分数会相加在一起,用总值来和阈值比较,确定相应的处理方式。

ScriptAssure 技术应用实例

下面让我们看看一些例子,看 IBM Rational 工具是如何发挥脚本的依赖性和独立性的优势,或者结合这两者来解决某些问题。

这个示例很简单:打开浏览器,加载 Google 的搜索页面,点击搜索按钮(无需输入任何搜索内容)。我们会在中文界面下录制、回放这段脚本,分析结果以及其中 ScriptAssure 技术的介入;再看看在英文界面下回放时,又会出现什么样的情况,它们的具体原因是什么。

图 5. 被测应用程序界面(中文)
图 5. 被测应用程序界面(中文)

在 Rational Functional Tester 中新建一个项目,通过“配置”菜单项设定被测应用程序——浏览器 iexplore.exe 后,我们可以启动它,再录制脚本的动作序列。

图 6. 配置被测应用程序(浏览器)
图 6. 配置被测应用程序(浏览器)

图 7. 启动被测应用程序,并开始录制
图 7. 启动被测应用程序,并开始录制

图 8. 自动测试项目及脚本
图 8. 自动测试项目及脚本

录制好的脚本大体如下:它会启动 IE 浏览器,激活地址栏来输入地址,再单击搜索按钮。

清单 1. 自动测试脚本局部
 
public void testMain(Object[] args)
{
	startApp("iexplore");
	
	// HTML Browser
	browser_htmlBrowser(document_(),DEFAULT_FLAGS).click(atPoint(354,46));
	browser_htmlBrowser(document_(),DEFAULT_FLAGS).inputKeys("www.google.com(ENTER)");
	// Document: Google: http://www.google.com/
	button_googlesubmit().click();
	
}

我们来回放一下脚本。默认情况下,测试执行一完成,测试日志会立即默认打开。如果您已经关闭了浏览器,那么还可以在 Functional Test Projects 视图中的 ScriptAssureProject_logs 节点下找到测试日志。日志的左侧框架提供了信息的快速导航。右侧边框提供所有细节。

本次回放测试一切正常,全部通过,没有任何失败和警告(尽管我们也没有添加任何显式测试验证点)。

图 9. 自动测试脚本在中文界面下的运行结果
图 9. 自动测试脚本在中文界面下的运行结果

接下来我们把浏览器的首选语言切换到英文优先,之后我们再打开浏览器,加载 Google 主页后,可以看见“Google 搜索”的字样变成了“Google Search”

图 10. 在浏览器选项中切换首选语言
图 10. 在浏览器选项中切换首选语言

图 11. 被测应用程序界面(英文)
图 11. 被测应用程序界面(英文)

现在我们再回放一下刚才录制的脚本,得到如下结果:带有警告的测试通过。

图 12. 自动测试脚本在英文界面下的运行结果
图 12. 自动测试脚本在英文界面下的运行结果

滚动到第一个警告处,应如图 13 所示。消息指示“Object Recognition is weak (above the warning threshold)”。这是 UI 上的组件发生变更时的情况。把 Rational Functional Tester 提供的对象查看器焦点移到被测按钮处,它可以展示当前各个属性细节(图 14)。

图 13. 被测按钮在英文界面下的可识别属性
图 13. 被测按钮在英文界面下的可识别属性

通过图 14 与图 2 的对比,我们可以看出属性“.value”的值在不同语言界面下发生了变化。对象图中保存的值是“Google 搜索”,而 Rational Functional Tester 在实际运行中发现的候选对象是“Google Search”。鉴于这个权重 100 的识别属性不符,以及页面 URL 属性的变化,最终算出的识别分值是 10800,大于事先设定的警告阈值,所以在结果报告中出现了警告。

如果您有兴趣的话,可以把高级模式设定(图 4)里的最后一栏设为“12000”,再执行一次测试脚本,会得到完全通过的测试结果,没有任何警告。

通过对 ScriptAssure 的定制,你可以调优脚本的运行,在无需改动测试逻辑(测试脚本代码)的前提下,让它回复得更严格一些,或更宽松一些,来适应不同类型产品,或者同一产品在不同阶段的测试需求,这极大降低了测试资产的维护成本,提高了测试效率。对于录制回放模式而言,可靠性和可维护性都获得了比较好的均衡。

Script Assure 的一些使用小经验

最后列出一些在实践中总结出的小经验,以供大家参考使用。

  • 如果您希望脚本回放更快,回放过程中产生更少、或者基本没有警告,请设置更高的识别阈值。这样识别时会少些模糊匹配、但更容易产生识别错误。某些情况下这种方式可能是比较有效的。
  • 如果识别时匹配得相当脆弱,请检查您的测试对象地图。是否是已获得的属性值发生变化?(例如,原来的“确定”字样变成现在的“确定。”,多了一个句号。)如果被测应用程序发生了永久性的改变,那我们需要更新测试对象图来反映这些变化。对于支持国际化的软件,最好使用测试对象的标签或识别号(id),而不是它的访问名,这样可以在一定程度上避免不同展示语言对对象识别的影响。
  • 如果被测应用程序的对象是动态的,或者在应用程序的多个版本中对象略有不同,我们可以用正则表达式来替换可识别属性。您也可以使用一个数值范围,来接受多个属性值,而不是局限在一个固定的值。
  • 如果是在开发周期的后期,产品基本稳定。你正在做维护、验证脚本的工作,可以把警告级别设为高,来获得最好的识别结果。如果遇到可能出现的问题警告,可以修复对象图来解决这一问题。

总结

本文首先阐释了自动化测试中的脚本独立性和脚本依赖性,以及它们之间的关系,并由此深入到 Rational Functional Tester 中所提供的高级特性 ScriptAssure,看它是如何在脚本独立性和脚本依赖性之间进行博弈,并在测试工作中取得良好的均衡效果。文中的实例可以帮助读者熟悉和实践不同模式下的回放过程,从而对灵活强大的 ScriptAssure 技术有了更为直接的感性认识。

参考资料

学习

获得产品和技术

讨论



LoadRunner性能测试基础
软件测试结果分析和质量报告
面向对象软件测试技术研究
设计测试用例的四条原则
功能测试中故障模型的建立
性能测试综述
更多...   


性能测试方法与技术
测试过程与团队管理
LoadRunner进行性能测试
WEB应用的软件测试
手机软件测试
白盒测试方法与技术


某博彩行业 数据库自动化测试
IT服务商 Web安全测试
IT服务商 自动化测试框架
海航股份 单元测试、重构
测试需求分析与测试用例分析
互联网web测试方法与实践
基于Selenium的Web自动化测试
更多...