在引入正题之前,让我们先了解一下自动化测试中的脚本独立性和脚本依赖性。自动化测试脚本的依赖性,是指在某些情况下,一个测试脚本必须依赖另一个测试脚本来完成一些关键性的工作。通常我们把这些依赖性分为两类:因为等待某些应用程序数据而依赖其他脚本,或因为等待某些应用程序状态而依赖其他脚本。
数据依赖 脚本的应用程序数据依赖于其他脚本来创建或维护。 状态依赖 脚本的应用程序起始状态依赖于其他一些脚本来导航和控制。这些脚本不启动应用程序,而是在应用程序中间某处开始执行。通常情况下,执行顺序对于依赖性脚本非常重要。依赖性脚本仰仗于之前的程序数据或程序状态的变化,那些被依赖的脚本必须在它们之前以特定顺序运行。如果它们的运行顺序有变,脚本将极有因为数据丢失或错误数据而失败。“测试脚本的独立性”并不完全是“脚本的依赖性”的对立面,但很接近。脚本独立性是指您的脚本都完全可以自给自足。测试脚本不需要依赖其他脚本来完成一些必要的工作。通常情况下,脚本独立性使得执行顺序并不重要,任一脚本都可以在任意时间执行。
在这一点上,独立的测试脚本似乎是一项明智的选择,那么为什么还要有依赖性的脚本存在?通常,脚本依赖性可以提升模块化程度,减少脚本的代码量(由于代码重用率较高)。这往往导致对代码维护的成本降低,因为有代码重用后总量更少了。例如,假设您只有一个登录门户的脚本,其他所有脚本都必须依赖于它登录到应用程序。在这种情况下,如果登录界面更改或登陆流程发生变化,你只需要更新一个脚本(而非所有涉及到登录的脚本)。
这又引来了对于自动化测试里记录和回放模式的一个经典的争论:脚本的独立性越高,就意味着你受应用程序的牵制越多,增加了程序维护的成本;而脚本依赖性则是试图减少开支。通过共享应用程序数据来降低测试案例数目,通过共享应用程序状态及模块化帮助你得到更健壮的测试案例。一言以蔽之,脚本的依赖性,会有助于降低代码量及维护成本。
当然,另一方面,脚本依赖性也不是十全十美的。依赖性脚本会导致阻塞性的错误。这种阻塞问题往往是一个产品缺陷,但它在被修复前会阻碍之后所有相关任务的执行,这会形成自动化测试和脚本的瓶颈。有了依赖性后,如果第一个脚本失败,该脚本之后的所有脚本都有可能失败。而且有了脚本依赖性,应用程序状态和数据共享也成为一个问题,数据共享和程序状态共享会使得脚本更为复杂,开发人员很难定位出错原因,这会严重影响可靠性。一般来说,独立的测试脚本此时则显得更为可靠。
从下图可以看出,随着脚本可靠性的增加,它的可维护性会必然下降,两者相互牵制。
图 1. 脚本的可维护性和可靠性
这是我们在进行自动化测试的策略制定、规划及开发过程中必须要做出的抉择,与此同时,我们也积累了很多办法来在这两者间取得一个最佳的平衡,让可靠的独立性脚本更加易于维护,或让强依赖性脚本变得更加可靠。本文要介绍的 Rational Functional Tester 中所应用的 ScriptAssure 技术就是其中的佼佼者。
ScriptAssure 目前为 IBM 的专有技术,通过对用户界面细节的识别阈值的定制,来实现了一种先进的查找最合理候选对象的匹配机制,使得脚本的维护工作不再囿于界面的频繁改动,变得更加轻松。稍后我们会通过一些实例来详细了解这项技术的精髓。
“录制和回放”模式是脚本独立性的最常见的实现模型。不论你是否反感“录制和回放”,它在测试工具演化历史里都有它的一席之地。人们不喜欢它主要是因为随着使用时间的延长,脚本很难维护。这种缺陷也是其他独立性较强的测试脚本的通病:你的脚本越多,你就要投入更多的时间和精力来维护他们。因为脚本间相互独立,如果你有 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. 测试对象图里保存的可识别属性,及权重信息
Rational Functional Tester 在识别被测应用程序里的对象时,要求该对象属性必需和对象图中事先保存的属性一致。默认情况下,Rational Functional Tester 最多可以容忍有 1 个或 2 个属性值出现偏差。如果有 2 个属性值不能和对象图内容相匹配,Rational Functional Tester 会在结果报告里记下一个“弱识别”警告,如果有 2 个以上的属性值不符,Rational Functional Tester 就无法找到目标对象了。
如果被测应用程序的对象发生了改变,您仍然可以回放功能测试脚本,这归功于脚本使用了 ScriptAssure 技术来控制对象匹配的敏感度。稍后我们还有实例来阐述。
在 Rational Functional Tester 中您可以打开“窗口”菜单里的“首选项”,使用两种模式来配置 ScriptAssure:
- 标准模式
ScriptAssure 标准模式,您可以使用滑块控制在回放时的匹配灵敏度。要设置在应用程序对象之间的识别宽容度,可以在“严格”和“宽松”间调整滑块来设置识别水平。同时也可以设置警告级别,一旦出现识别差异后,应如何处理,在结果报告里抛出警告或者忽略。
图 3. ScriptAssure 标准模式
- 高级模式
在 ScriptAssure 页的高级模式下(点击上图的“高级”按钮后),可以设置识别分数的阈值,更加细致地来控制 ScriptAssure 的应用。可以设置一个最高分,来决定是否接受该候选对象;如果候选对象和原先定义间识别分数大于阈值,则被视为不可接受。
图 4. ScriptAssure 高级模式
Rational Functional Tester 用以下算法来计算被测应用程序里对象的识别分数。例如,如果某对象和对象图里的属性值完全匹配,其得分为 0。如果目标对象有一个权重为 100 的属性不相符,它的评分是:
Σ(不相符属性的权重 *100) = 100*100 = 10,000。如果对象有两个权重 100 的属性不匹配,它的评分是 20,000。识别分值越高,表明差异越大、匹配越不精确,识别分值喻示着不匹配的程度,我们在测试时还是希望识别分值越小越好。
您可以自行设定识别分数的阈值,比如接受承认的最大分值的阈值,最后一次机会识别分值,模糊识别分数偏差的阈值,并且如果我们接受了大于阈值的分数会发出警告。在回放过程中,测试对象所有属性的识别分数会相加在一起,用总值来和阈值比较,确定相应的处理方式。
下面让我们看看一些例子,看 IBM Rational 工具是如何发挥脚本的依赖性和独立性的优势,或者结合这两者来解决某些问题。
这个示例很简单:打开浏览器,加载 Google 的搜索页面,点击搜索按钮(无需输入任何搜索内容)。我们会在中文界面下录制、回放这段脚本,分析结果以及其中 ScriptAssure 技术的介入;再看看在英文界面下回放时,又会出现什么样的情况,它们的具体原因是什么。
图 5. 被测应用程序界面(中文)
在 Rational Functional Tester 中新建一个项目,通过“配置”菜单项设定被测应用程序——浏览器 iexplore.exe 后,我们可以启动它,再录制脚本的动作序列。
图 6. 配置被测应用程序(浏览器)
图 7. 启动被测应用程序,并开始录制
图 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. 自动测试脚本在中文界面下的运行结果
接下来我们把浏览器的首选语言切换到英文优先,之后我们再打开浏览器,加载 Google 主页后,可以看见“Google 搜索”的字样变成了“Google Search”
图 10. 在浏览器选项中切换首选语言
图 11. 被测应用程序界面(英文)
现在我们再回放一下刚才录制的脚本,得到如下结果:带有警告的测试通过。
图 12. 自动测试脚本在英文界面下的运行结果
滚动到第一个警告处,应如图 13 所示。消息指示“Object Recognition is weak (above the warning threshold)”。这是 UI 上的组件发生变更时的情况。把 Rational Functional Tester 提供的对象查看器焦点移到被测按钮处,它可以展示当前各个属性细节(图 14)。
图 13. 被测按钮在英文界面下的可识别属性
通过图 14 与图 2 的对比,我们可以看出属性“.value”的值在不同语言界面下发生了变化。对象图中保存的值是“Google 搜索”,而 Rational Functional Tester 在实际运行中发现的候选对象是“Google Search”。鉴于这个权重 100 的识别属性不符,以及页面 URL 属性的变化,最终算出的识别分值是 10800,大于事先设定的警告阈值,所以在结果报告中出现了警告。
如果您有兴趣的话,可以把高级模式设定(图 4)里的最后一栏设为“12000”,再执行一次测试脚本,会得到完全通过的测试结果,没有任何警告。
通过对 ScriptAssure 的定制,你可以调优脚本的运行,在无需改动测试逻辑(测试脚本代码)的前提下,让它回复得更严格一些,或更宽松一些,来适应不同类型产品,或者同一产品在不同阶段的测试需求,这极大降低了测试资产的维护成本,提高了测试效率。对于录制回放模式而言,可靠性和可维护性都获得了比较好的均衡。
最后列出一些在实践中总结出的小经验,以供大家参考使用。
- 如果您希望脚本回放更快,回放过程中产生更少、或者基本没有警告,请设置更高的识别阈值。这样识别时会少些模糊匹配、但更容易产生识别错误。某些情况下这种方式可能是比较有效的。
- 如果识别时匹配得相当脆弱,请检查您的测试对象地图。是否是已获得的属性值发生变化?(例如,原来的“确定”字样变成现在的“确定。”,多了一个句号。)如果被测应用程序发生了永久性的改变,那我们需要更新测试对象图来反映这些变化。对于支持国际化的软件,最好使用测试对象的标签或识别号(id),而不是它的访问名,这样可以在一定程度上避免不同展示语言对对象识别的影响。
- 如果被测应用程序的对象是动态的,或者在应用程序的多个版本中对象略有不同,我们可以用正则表达式来替换可识别属性。您也可以使用一个数值范围,来接受多个属性值,而不是局限在一个固定的值。
- 如果是在开发周期的后期,产品基本稳定。你正在做维护、验证脚本的工作,可以把警告级别设为高,来获得最好的识别结果。如果遇到可能出现的问题警告,可以修复对象图来解决这一问题。
本文首先阐释了自动化测试中的脚本独立性和脚本依赖性,以及它们之间的关系,并由此深入到 Rational Functional Tester 中所提供的高级特性 ScriptAssure,看它是如何在脚本独立性和脚本依赖性之间进行博弈,并在测试工作中取得良好的均衡效果。文中的实例可以帮助读者熟悉和实践不同模式下的回放过程,从而对灵活强大的 ScriptAssure 技术有了更为直接的感性认识。
原文链接:http://www.ibm.com/developerworks/cn/rational/r-cn-rftscriptassure/index.html
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/14780873/viewspace-669845/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/14780873/viewspace-669845/