GUI自动化测试稳定性,最典型的表现形式就是,同样的测试用例在同样的环境上,时而测试通 过,时而测试失败。 这也是影响GUI测试健康发展的一个重要障碍,严重降低了GUI测试的可信性。

五种造成GUI测试不稳定的因素:
1. 非预计的弹出对话框;
2. 页面控件属性的细微变化;
3. 被测系统的A/B测试;
4. 随机的页面延迟造成控件识别失败;
5. 测试数据问题

非预计的弹出对话框

非预计的弹出对话框,一般包含两种场景;
1. GUI自动化测试用例执行过程中,操作系统弹出的非预计对话框, 有可能会干扰GUI测试的自动化 执行。 比如,GUI测试运行到一半,操作系统突然弹出杀毒软件更新请求、病毒告警信息、系统更新请求 等对话框。这种对话框的弹出往往是难以预计的,但是一旦发生就有可能造成GUI自动化测试的不 稳定。
2. 被测软件本身也有可能在非预期的时间弹出预期的对话框, GUI自动化测试有可能会因此而失败。 比如,被测软件是一个电子商务网站,你在网站上进行操作时,很可能会随机弹出“用户调查”对话 框。虽然这种对话框是可知的,但是具体会在哪一步弹出却是不可预期的。而这,往往会造 成GUI自动化测试的不稳定。
怎么解决这类问题呢?
先试想一下,如果你在手工测试时,遇到了这种情况,会如何处理?很简单啊,直接点击对话框上 的“确认”或者“取消”按钮,关闭对话框,然后继续相关的业务测试操作。
对GUI自动化测试来说,也是同样的道理。具体做法是:
当自动化脚本发现控件无法正常定位,或者无法操作时,GUI自动化框架自动进入“异常场景恢复模 式”。 在“异常场景恢复模式”下,GUI自动化框架依次检查各种可能出现的对话框,一旦确认了对话框的类 型,立即执行预定义的操作(比如,单击“确定”按钮,关闭这个对话框),接着重试刚才失败的步 骤。
需要注意的是:这种方式只能处理已知可能出现的对话框。而对于新类型的对话框,只能通过自动化的 方式尝试点击上面的按钮进行处理。每当发现一种潜在会弹出的对话框,我们就把它的详细信息(包括 对象定位信息等)更新到“异常场景恢复”库中,下次再遇到相同类型的对话框时,系统就可以自动关闭 了。
页面控件属性的细微变化
如果页面控件的属性发生了变化,哪怕只是细微的变化,也会导致测试脚本的定位元素失效。
比如,“登录”按钮的ID从“Button_Login_001”变成了“Button_Login_888”,那么如果GUI自动化测试脚本 还是按照原来的“Button_Login_001”来定位“登录”按钮,就会因为ID值的变化,定位不到它了,自动化 测试用例自然就会失败。
如何解决这个问题呢?还是先试想一下,如果手动操作时遇到了这个问题会怎么处理,然后再把手动处 理的方式用编程语言实现。
当“登录”按钮的ID 从“Button_Login_001”变成了 “Button_Login_888”,你手动操作时可能一眼就发现 了。那你是怎么做到一眼发现的呢?
细想一下,你会发现人的思维过程应该是这样的:
现在,我来提炼一下这个定位控件的思路:
1. 通过控件类型(Button)缩小了范围;
2. 通过属性值中的关键字(Login)进一步缩小范围;
3. 根据属性值变化前后的相似性,最终定位到该控件。
看到这里,你得到什么启发了吗?
采用“组合属性”定位控件会更精准,而且成功率会更高,如果能在此基础上加入“模糊匹配”技术,可以 进一步提高控件的识别率。
“模糊匹配”是指,通过特定的相似度算法,控件属性发生细微变化时,这个控件依旧可以被准确定位。
目前,一些商用GUI自动化测试工具,比如UFT,已经实现了模糊匹配。通常情况下,你只需要启用“模 糊匹配”选项即可。如果某个对象的定位是通过模糊匹配完成的,那么,测试报告中将会显示该信息, 明确告知此次对象识别是基于模糊匹配完成的,因为GUI自动化工具并不能保证每次模糊匹配都一定正 确。
但是,开源的GUI自动化测试框架,目前还没有现成的框架直接支持模糊匹配,通常需要你进行二次开 发,实现思路是:实现自己的对象识别控制层,也就是在原本的对象识别基础上额外封装一层,在这个 额外封装的层中加上模糊匹配的实现逻辑。
通常,我不建议把模糊匹配逻辑以硬编码的方式写在代码里,而是引入规则引擎,将具体的规则通过配
你发现页面上的按钮(Button)就那么几个,而且从ID中包含的关键字(Login)可以看 出是“登录”按钮,再加上这个按钮的ID是“Button_Login_001”,“Button_Login_888”怎么 看都是同一个对象,只是ID最后的数字发生了变化而已。
置文件的方式与代码逻辑解耦。
被测系统的A/B测试

A/B测试,是互联网产品常用的一种测试方法。它为Web或App的界面或流程提供两个不同的版本,然 后让用户随机访问其中一个版本,并收集两个版本的用户体验数据和业务数据,最后分析评估出最好的 版本用于正式发布。
A/B 测试通常会发布到实际生产环境,所以就会造成生产环境中GUI自动化测试的不稳定。
这种问题的解决思路是,在测试脚本内部对不同的被测版本做分支处理,脚本需要能够区分A和B两个 的不同版本,并做出相应的处理。
随机的页面延迟造成控件识别失败

随机的页面延迟,也是GUI测试防不胜防的。既然是随机的,也就是说我们没有办法去控制它,那有没 有什么办法去减少它造成的影响呢?
一个屡试不爽的办法就是,加入重试(retry)机制。重试机制是指,当某一步GUI操作失败时,框架会 自动发起重试,重试可以是步骤级别的,也可以是页面级别的,甚至是业务流程级别的。
对于开源GUI测试框架,重试机制往往不是自带的功能,需要自己二次开发来实现。
比如,eBay的GUI自动化测试框架,分别实现了步骤级别、页面级别和业务流程级别的重试机制,默认 情况下启用的是步骤级别的重试,页面级别和业务流程级别的重试可以通过测试发起时的命令行参数进 行指定。
需要特别注意的是,对于那些会修改一次性使用数据的场景,切忌不要盲目启用页面级别和业务流程级 别的重试。
测试数据问题

测试数据问题,也是造成GUI自动化测试不稳定的一个重要原因。
比如,测试用例所依赖的数据被其他用例修改了;再比如,测试过程中发生错误后自动进行了重试操 作,但是数据状态已经在第一次执行中被修改了。
这样的场景还有很多,我会在后面的测试数据准备系列文章中详细展开,并分析由此引入的测试不稳定 性问题的解决思路。
总结 根据我的实践经验,我归纳了五种造成GUI自动化测试不稳定的主要因素,并给出了对应的解决思路。
1. 对于非预计的弹出对话框引起的不稳定,可以引入“异常场景恢复模式”来解决。
2. 对于页面控件属性的细微变化造成的不稳定,可以使用“组合属性”定位控件,并且可以通过“模糊匹 配技术”提高定位识别率。
3. 对于A/B测试带来的不稳定,需要在测试用例脚本中做分支处理,并且需要脚本做到正确识别出不 同的分支。
4. 对于随机的页面延迟造成的不稳定,可以引入重试机制,重试可以是步骤级别的,也可以是页面级 别的,甚至是业务流程级别的。
5. 对于测试数据引起的不稳定,我在这里没有详细展开,留到后续的测试数据准备系列文章中做专门 介绍。

提高CUI测试稳定性技术的更多相关文章

  1. 17 | 精益求精:聊聊提高GUI测试稳定性的关键技术

  2. 提高GUI自动化测试稳定性解决方案

    针对"GUI自动化测试稳定性问题"这个问题,最典型的情景就是:同样的测试用例,在同样的测试执行环境下,测试的结果有时是Success,有时是Fail,这严重降低了GUI测试的可信度 ...

  3. MBIST:用于嵌入式存储器的可测试设计技术

    MBist技术可以自动实现存储器单元或阵列的RTL级内建自测试电路,MBIST的EDA工具支持多种测试算法的自动实现,可针对一个或多个内嵌存储器自动创建BIST逻辑,并完成BIST逻辑与存储器的连接, ...

  4. 《Python 测试开发技术栈—巴哥职场进化记》—每日站会的意义

    上文<Python测试开发技术栈-巴哥职场进化记>-一道作业题我们讲到华哥给巴哥出了一道作业题,让巴哥用Python实现记录日志的功能,巴哥历经"千辛万苦",终于做出了 ...

  5. 关于《精通移动App测试实战:技术、工具和案例》图书勘误信息

    首先,对由于我们工作的疏忽向<精通移动App测试实战:技术.工具和案例>读者朋友们表示歉意,同时已将这些问题反馈给了出版社编辑同志,再版时将会统一修正: 其次,勘误信息请参看附件pdf文档 ...

  6. 测试开发技术:DOM中 innerHTML、innerText、outerHTML、outerText的区别

    测试开发技术:DOM中 innerHTML.innerText.outerHTML.outerText的区别   我们在做web自动化的过程中通过dom处理web页面元素,那么你就要了解innerHT ...

  7. 测试工程师技术tree(“自言自语”)

    理论部分 1.测试分为哪几个阶段 2.测试的流程是什么 3.如何做好测试计划 4.常见的测试用例设计方法有哪些 5.一条bug记录包含哪些内容 5.如何分层自动化测试 6.如何保证脚本的有效性 7.如 ...

  8. 《Python测试开发技术栈—巴哥职场进化记》—前言

    写在前面 今年从4月份开始写一本讲Python测试开发技术栈的书,主要有两个目的,第一是将自己掌握的一些内容分享给大家,第二是希望自己能系统的梳理和学习Python相关的技术栈.当时我本来打算以故事体 ...

  9. 《Python测试开发技术栈—巴哥职场进化记》—初来乍到,请多关照

    上文<巴哥职场进化记-Python测试开发技术栈>开篇讲到巴哥毕业初到深圳,见到了来自五湖四海的室友.一番畅聊之后,抱着对未来职场生活的期待,大家都进入了梦乡.今天我们来看看巴哥第一天上班 ...

随机推荐

  1. mysql 时间索引执行计划

    项目中查询时间断的数据发现查询时间很长.怀疑没有走时间的索引,于是explain一下 EXPLAIN select * from t_order where created_at>'2015-0 ...

  2. XML DOM (Document Object Model) 定义了访问和操作 XML 文档的标准方法。

    XML DOM DOM 把 XML 文档视为一种树结构.通过这个 DOM 树,可以访问所有的元素.可以修改它们的内容(文本以及属性),而且可以创建新的元素.元素,以及它们的文本和属性,均被视为节点. ...

  3. BZOJ 4423: [AMPPZ2013]Bytehattan 平面图转对偶图 + 并查集

    Description 比特哈顿镇有n*n个格点,形成了一个网格图.一开始整张图是完整的.有k次操作,每次会删掉图中的一条边(u,v),你需要回答在删除这条边之后u和v是否仍然连通. Input 第一 ...

  4. [Usaco2010 Dec]Treasure Chest 藏宝箱

    题目链接:点这里 Solution: 刚开始以为是博弈论,然而不是... 首先考虑n方dp,设f(l,r)为只有\(l\)到\(r\)区间的钱的先手最大获利 那么我们可以得到式子f(l,r)=sum( ...

  5. Pycharm,出现Invalid VCS root mapping The directory 解决方法

    Pycharm File 中setting-------version control  中VCS选择none  后选择ok 执行完以上的步骤,还错误就会消失.

  6. Windows Server 部署WEB API时内部错误

    Windows Server 部署WEB API时,发生HTTP 错误 500.21 - Internal Server Error,如图所示: 错误原因:IIS注册Framework4.0 解决方法 ...

  7. mysql中对比 JSON_VALUE 与 JSON_QUERY

    1. JSON概述 MySQL里的json分为json array和json object. $表示整个json对象,在索引数据时用下标(对于json array,从0开始)或键值(对于json ob ...

  8. gdb break 断点设置

    http://sourceware.org/gdb/current/onlinedocs/gdb/ 断点设置 gdb断点分类: 以设置断点的命令分类: breakpoint 可以根据行号.函数.条件生 ...

  9. spring session 加载的时候一些配置问题

    启动springboot时候的错误信息: An attempt was made to call the method org.springframework.boot.autoconfigure.s ...

  10. OperationCenter Docker运行环境及其依赖启动脚本

    1.Portainer docker rm -f portainer docker run -d -p : --name portainer --restart always portainer/po ...