提高CUI测试稳定性技术
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测试稳定性技术的更多相关文章
- 17 | 精益求精:聊聊提高GUI测试稳定性的关键技术
- 提高GUI自动化测试稳定性解决方案
针对"GUI自动化测试稳定性问题"这个问题,最典型的情景就是:同样的测试用例,在同样的测试执行环境下,测试的结果有时是Success,有时是Fail,这严重降低了GUI测试的可信度 ...
- MBIST:用于嵌入式存储器的可测试设计技术
MBist技术可以自动实现存储器单元或阵列的RTL级内建自测试电路,MBIST的EDA工具支持多种测试算法的自动实现,可针对一个或多个内嵌存储器自动创建BIST逻辑,并完成BIST逻辑与存储器的连接, ...
- 《Python 测试开发技术栈—巴哥职场进化记》—每日站会的意义
上文<Python测试开发技术栈-巴哥职场进化记>-一道作业题我们讲到华哥给巴哥出了一道作业题,让巴哥用Python实现记录日志的功能,巴哥历经"千辛万苦",终于做出了 ...
- 关于《精通移动App测试实战:技术、工具和案例》图书勘误信息
首先,对由于我们工作的疏忽向<精通移动App测试实战:技术.工具和案例>读者朋友们表示歉意,同时已将这些问题反馈给了出版社编辑同志,再版时将会统一修正: 其次,勘误信息请参看附件pdf文档 ...
- 测试开发技术:DOM中 innerHTML、innerText、outerHTML、outerText的区别
测试开发技术:DOM中 innerHTML.innerText.outerHTML.outerText的区别 我们在做web自动化的过程中通过dom处理web页面元素,那么你就要了解innerHT ...
- 测试工程师技术tree(“自言自语”)
理论部分 1.测试分为哪几个阶段 2.测试的流程是什么 3.如何做好测试计划 4.常见的测试用例设计方法有哪些 5.一条bug记录包含哪些内容 5.如何分层自动化测试 6.如何保证脚本的有效性 7.如 ...
- 《Python测试开发技术栈—巴哥职场进化记》—前言
写在前面 今年从4月份开始写一本讲Python测试开发技术栈的书,主要有两个目的,第一是将自己掌握的一些内容分享给大家,第二是希望自己能系统的梳理和学习Python相关的技术栈.当时我本来打算以故事体 ...
- 《Python测试开发技术栈—巴哥职场进化记》—初来乍到,请多关照
上文<巴哥职场进化记-Python测试开发技术栈>开篇讲到巴哥毕业初到深圳,见到了来自五湖四海的室友.一番畅聊之后,抱着对未来职场生活的期待,大家都进入了梦乡.今天我们来看看巴哥第一天上班 ...
随机推荐
- 【shell】文本按行逆序
1.最简单的方法是使用tac [root ~]$ seq |tac 2.使用tr和awk. tr把换行符替换成自定义的分隔符,awk分解替换后的字符串,并逆序输出 [root ~]$ seq | tr ...
- HTML5测试(二)
HTML5测试(四) 1.input 元素中,下列哪个类型属性定义了输入电话号码的控件? A.mob B.tel C.mobile D.telephone 答案:B 具有 type 属性的 input ...
- vue学习-day03(动画,组件)
目录: 1.品牌列表-从数据库获取列表 2.品牌列表-完成添加功能 3.品牌列表-完成删除功能 4.品牌列表-全局配置数据接口的根域名 5.品牌列表-全局配置emulateJS ...
- Lucene实践:全文检索的基本原理
一.总论 根据http://lucene.apache.org/java/docs/index.html 定义: "Apache Lucene(TM) is a high-performan ...
- 【bzoj3223】Tyvj 1729 文艺平衡树
题目描述: 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1 输入 ...
- 一台linux机器远程mount另一台linux机器
本机电脑系统是unbantu,要将另一台linux电脑上的文件mount到本机目录下.mount的原理是网络文件系统,即NFS,本机操作步骤如下 一,安装 nfs-common : apt inst ...
- linux下挂载磁盘
1.使用fdisk 查看硬盘信息 [root@localhost ~]# fdisk -l Disk /dev/sdb: 107.4 GB, 107374182400 bytes 255 heads, ...
- Python的sys.argv用法
import sys a = sys.argv[:] print("输入的参数为:", a) def train_start(start_time, end_time, selec ...
- p1848 [USACO12OPEN]书架Bookshelf
分析 单调队列优化dp即可 正确性显然,详见代码 代码 #include<bits/stdc++.h> using namespace std; #define int long long ...
- Fresnel integral菲涅尔积分的一丢丢探讨
起因源于导师的关于回旋曲线的一点问题 其中最后得到的曲率公式中的c,s’和s定义不明确 于是开始从头从(2.1)式中的积分入手探究 维基百科中Fresnel integral的S(x)与C(x)的定义 ...