天天看点

GUI自动化测试核心技术

实 验 简 介

对于界面级自动化测试来说,目前在企业当中应用相当普遍,究其原因是因为其入门相对简单,同时,目前的各类工具也较为成熟,不需要过多的程序设计经验便可以开始实施起来。并且通过录制回放的方式就可以快速看到效果。

但是,往往也正是因为所谓的表面上的简单实施,导致很多企业盲目上马开展起界面级自动化测试的实施工作。但是随着越来越深入,我们会发现,问题越来越多,到最后不了了之,甚至谈自动化测试色变。

这些都是不可取的,本节内容将主要为大家梳理一下技术体系及实施过程当中的各类可能的问题,以使读者对界面级自动化测试有一个更加清晰的认识,不盲目自信,也不必要灰心丧气。

实 验 目 的

(1) 理解界面级自动化测试技术的核心要素。

(2) 理解实施界面级自动化测试的优势与不足。

(3) 对自动化测试技术体系有更加完整的理解。

实 验 流 程

1.界面级自动化测试简介

无论是单机应用程序,APP,B/S架构还是C/S架构的网络应用程序,一个应用程序通常都是会有界面的,即使是有一个命令行的程序,事实上它也是有界面的,只不过它的界面是命令提示符而已。所以,基于界面的测试,我们把它统归为一类,这一类技术我们更多的强调是可视化的界面,无论是一个浏览器的应用,还是一个比如像QQ、OUTLOOK等等这种标准的C/S架构的应用,它的基于前端操作部分的测试都称之为基于界面的测试。

我们前面已经学习了基于代码的接口测试和基于协议的接口测试,均可以很好地完成自动化测试开发。同样的道理,针对基于界面的测试也可以做到自动化。无非就是想办法模拟出人对界面元素的定位和相应的操作即可。

界面级自动化测试主要依靠代码或工具来自动化操作被测应用程序的对象或控件,并检查其实际结果与期望结果是否相符来达到自动化测试的目的。当今流行的界面级自动化测试工具或框架主要有:Selenium,Appium,RFT,QTP,CodeUI,WatiR,TestComplete,SikuliX等,应用级自动化测试工具很多,每一个都有其独到之处,也都有其不足,所以与其花过多时间探讨工具本身,还不如多思考一下,如何有效地组织和利用这些工具和技术,来更好地配合我们的项目,提升测试效率。

2.界面级自动化测试工作原理

由于界面级自动化测试主要是模拟人通过界面操作来完成相应的测试,这类测试通常包括功能性测试,兼容性测试等。当然,更多地是用于回归测试,验证新版本的功能特性的加入没有影响到老版本的功能,这也是自动化测试的核心价值所在。

另外,从技术实现原理上来说,基于界面的自动化测试主要解决两大技术问题:

(1)如何模拟出正常的人类操作界面的行为。

(2)如何利用相关技术实现对测试结果的判断。

我们再来思考,我们人类在操作一个软件的界面并完成黑盒测试的时候,会是怎样的一个过程呢?

(1)设计测试用例,定义好该测试的期望结果。

(2)运行被测程序,进入到被测程序相应的界面。

(3)通过人脑和眼睛找到我们需要操作的那个界面元素。

(4)通过鼠标或键盘操作对应的那个元素。

(5)判断界面上的反应,或者通过其他方式检查其结果是否正确。

事实上,这一过程,也同样适用于界面级自动化测试,其实现技术与上述过程殊途同归。基于笔者多年的研究,我们将其工作原理归纳为如下几个方面:

(1)通过模拟按键操作和鼠标定位来进行自动化测试。

(2)通过基于界面图像识别和定位来进行自动化测试。

(3)通过识别界面元素的核心属性来进行自动化测试。

3.模拟按键操作和鼠标定位

如果我们要将鼠标定位和操作与键盘输入让计算机自动完成,原理非常简单:用一个程序来记录鼠标的移动轨迹和各种事件(如单击,双击,右鍵,滚动等),并记录下相应的按键情况,然后顺序地把这些记录的操作回放一遍,便实现了自动化。众所周知的自动化操作软件“按键精灵”,便实现了上述自动化过程。我们也可以利用Java完成一个类似的操作。

基于鼠标定位和按键操作的优点是简单易学,比如上述的工具“按键精灵”,我们只需要将整个操作完整的录制一遍,则工具就会按照一样的路径和操作顺序忠实地回放一遍。

但是,我们也发现了问题,而且从测试的角度来说,问题还挺严重:

(1)测试脚本的稳定性问题:由于工具只是简单地记录了鼠标的移动轨迹和按键操作,一旦回放执行过程中有一些其它的窗口出现或者异常情况,那么回放操作将无法正常进行。

(2)被测试窗口失去焦点:像按键精灵这样的工具是属于没有任何智能化的属性的,只是简单忠实地回放,所以一旦窗口推动焦点,那么所有的操作将会在获得焦点的窗口上进行,这样的操作便变得没有实际意义。当然,我们也可以通过相应的判断来预防此类事件发生。但是毕竟这方面的潜在风险是比较大的。

(3)屏幕分辨率变化问题:由于鼠标移动轨迹严格执行脚本中录制到的定位,所以一旦屏幕的分辨率不样了,那么被测试应用程序的相应位置也会随之变化,这样必须导致问题。

(4)界面元素位置变化问题:由于我们的产品并没有完全固化,所以界面的改动也是必然的情况,针对这种情况,我们的脚本将不再适用,必须重新录制相应的操作。

(5)关于自动化测试的断言问题:因为针对自动化测试来说,我们不单单需要实现对界面的基本操作,而且我们还需要有断言才能够知道测试结果是否如预期一样,没有断言是不能够被称之为测试的。所以,要实施好基于鼠标定位的自动化测试,还需要结合其它自动化测试技术才有效。

4.基于图像识别的定位操作

事实上,目前的图像处理算法已经非常成熟了,准确率也非常高。在基于图像识别的自动化测试工具中,比较具有代表性的是SikuliX(官方网站:http://www.sikulix.com),由美国麻省理工学院开发的一种最新编程技术,使得编程人员可以使用截图替代代码,从而简化代码的编写流程。其主要应用领域就是自动化测试。

图像识别是怎么来做的呢?虽然我不是很智能的知道某个我要点的按钮是在屏幕上哪个位置,但是我可以拿一块图像来进行对比,比方说我就截一个图,我就拿截的这张小图,我在屏幕上挨个去轮番的对比一次,我去看有哪个位置有长的像这张图片一样的,就去识别到它,去操作它。

所以你会发现,无论是图像识别还是坐标定位,它总会有个最大的问题在哪里呢?它是不可靠的,定位的准确度是比较低的。下图显示的是SikuliX脚本开发效果。

GUI自动化测试核心技术

但是相对于按键精灵来说,SikuliX还是很好地规避了诸多按键精灵的弊端,比如引入了更强大的基于Jython的脚本引擎(即一种Python语言的Java实现),并基于流行的OpenCV计算机视觉库进行Java版实现,进而对于界面元素识别的容错能力,实现了标准的断言,通过对比两张图像是否一致来决定测试结果的正确性等。所以,在相对稳定的项目中,我们已经可以较好地使用SikuliX来完成自动化测试了。

由于并不是所有的界面元素都是标准的,都是操作系统底层支持的,所以很多时候,SikuliX这种不区分界面元素类型的工具,反而有其特殊的价值。但是从稳定性上来说,也同样存在问题,比如界面元素的风格变化或者大小的变化等,或者是多个元素的图像非常类似的情况,都会导致SikuliX无法正确地识别的操作。所以我们仍然有必要继续探寻更加稳定的自动化测试实施方案。

但是从另一个角度来说,基于图像识别机制的这类自动化测试工具,虽然稳定性存在问题,但是却是适用场景最广泛的,对界面级自动化测试技术是一个很好的补充。因为这类工具不需要关注界面类型,程序类型,我们可以利用SikuliX这类自动化测试工具,完成几乎所有类型的GUI测试自动化。无论是一个标准的Windows应用,还是一个Java或.NET应用,或者一个Web应用或者App应用,甚至是GUI自动化测试领域最难处理的游戏自动化。

正是受到SikuliX这款工具的启发,笔者也利用纯Java代码完整实现了一个简洁的基于图像识别的自动化测试框架(核心操作主要基于Java的BufferedImage和Robot对象),并完全基于图像识别的自动化测试工具的核心原理进行实现。该框架只有几百行代码,却可以实现针对几乎所有界面类型(包括手机App端功能)进行自动化测试。

如果你

①从事功能测试,想进阶自动化测试

②在测试界混了1、2年,依然不会敲代码

③面试大厂却屡屡碰壁

我邀你进群吧!来吧~~测试员,313782132(Q群里有技术大牛一起交流分享,学习资源的价值取决于你的行动,莫做“收藏家”)获取更多大厂技术、面试资料

GUI自动化测试核心技术