1、GUI偏重功能和页面测试,应使用工具如Selenium、QTP(UFT)来完成自动化测试。
Selenium简介:
1.0核心是Selenium RC,RC Server + Client Lib组成,RCServer包括Launcher、Http Proxy、Selenium Core三个部分,Core是被注入到浏览器页面的JS函数集合,用来实现界面元素的识别和操作,Http Proxy作为代理服务器修改JS的源,以达到欺骗被测站点的目的,Launcher用来在启动测试浏览器时完成Core的注入和浏览器代理的设置;
过程如下:测试用例通过Client Lib向RC Server发送Http请求,建立连接;Launcher启动/打开浏览器,加载Core和设置当前浏览器的代理服务器为Http Proxy;测试用例通过Client Lib向RC Server发送Http请求,RCServer解析请求,通过HttpProxy发送JS命令通知Core执行浏览器上控件的具体操作;Core接收指令,执行操作;浏览器收到新的页面请求消息,则会发送Http请求,由于设置了代理服务器为Http Proxy,所有RCServer启动的浏览器请求都会被截获;RCServer对接收到的Http请求重组,规避同源策略;Http Proxy把收到的响应返回给浏览器。
2.0核心是WebDriver,3.0类似2.0,只是增加了Safari和Edge浏览器支持,且不再兼容1.0。 webdriver通过浏览器原生的Webdriver实现页面操作。
2、脚本与数据的解耦及Page Object模型
脚本与数据的解耦本质是实现数据驱动的测试,对于操作相同而只是数据不同的,通过一套脚本自动搞定。脚本+数据文件,这个和各类工具的实现思想都一致的。
Page Object模型核心理念就是,以页面为单位对页面上的控件及部分操作进行封装。目前已经有PageObject自动生成的测试工具,例如UFT、Katalon Studio(开源),自动对目标页面进行对象定位,但是面临许多难题,页面如果是根据数据动态生成的,它就很难完成任务了。
3、自动化GUI测试中业务抽象的实现方法
关键就是解决两个问题,操作函数的粒度(根据项目实际情况,对可以独立的业务步骤尽量函数封装,以方便重用),页面操作函数之间的衔接(一般是下一步直接使用上一步的页面;需要跳转的,要考虑页面跳转)。
业务流程抽象就是按照一个固定的模式来完成业务流程,从而简化测试用例设计。一种通用模式如:1、初始化一个业务流程参数输入类的实例;2 、给这个实例赋值;3、用这个实例来初始化业务流程类的实例;4、执行这个业务流程实例。本质上还是分解成数据和脚本。从业务的维度来完成测试业务流程封装,适合完成系统功能测试。
Headless浏览器(无头浏览器)运行过程中不显示界面。可以高效实现GUI自动测试,速度更快,外部干扰更少、甚至可以在单机上实现测试的并发执行。缺点就是不完全真实。Google发布的Headless Chrome是最流行的。
4、测试数据准备
当然一般就两类,一类是事先通过数据库等创建好,这个一般量大速度快,要注意做好备份和区隔;一类是测试过程中,从测试用例里读取数据文件后,调用API来即时生成数据,这种一般更稳定。
GUI测试数据自动生成策略:一是根据数据模型,对某些id或某些类型,直接提供各类数据支持,例如字符串类型,就会有Null、超长、英文字符串、中文字符串、多种语言混合字符串、SQL注入串、超长字符串等自动匹配。二是不同输入之间的笛卡尔积。UFT已经提供支持。
5、GUI测试稳定性
a、非预计的弹出框:系统的和被测软件的,处理方法是,增加异常处理,对执行过程中预计会出现的异常框进行识别;
b、页面控件属性的细微变化: 增加模糊识别的处理模块。UFT等已提供支持。Selenium需要自己编码。
c、被测系统A/B测试:脚本有考虑版本,需要分叉处增加判断
d、随机的页面延迟:增加重试机制,一般由步骤级别、页面级别、业务流程级别的重试,需要注意数据可能在重试前已经被改变
e、测试数据:依赖数据被修改、重试时前次已经污染数据等,