一、自动化测试
1、自动化测试脚本大致可划分为:
|、线性脚本:通过录制直接产生的线性可执行的脚本
|、结构化脚本:具有顺序、循环、分支等结构的脚本
|、可共享脚本:可以被多个用例使用,被其他脚本调用的脚本(即模块化脚本)
|、数据驱动脚本:测试数据跟业务流程控制分离的脚本,通过读入数据文件驱动流程进行的脚本
|、关键词驱动脚本:脚本、数据、业务分离、数据和关键词在不同的数据表中,通过关键词来驱动测试业务逻辑,关键词的特点是,它更像是描述一个测试用例在做什么,而不是如何做
|、混合型脚本:以上任意两种及以上
|、敏捷自动化测试脚本/框架:这一块等我有了成功经验再补充=。=
2、自动化测试执行:
(1)无人值守的测试:环境搭建,部署与配置;自动化测试用例与测试脚本相互绑定;自动化测试用例执行顺序排列与组合
(2)异常处理与场景恢复
3、自动化测试的难点(界面的变动性和脚本的维护性):
①公共自动化用例的维护
②公共UI方法维护
③稳定性和效率提升:
|、异常处理封装
|、分层测试
|、建立共享对象库/测试库
|、第三方插件引入
|、GUI业务流程解耦拆分、尽量避免太长的端到端UI测试(例如web到移动端的业务流测试)
|、引入mock/接口测试代替部分环节的测试,从而衔接到要执行自动化测试,提高自动化测试稳定和效率
|、web处理一些不可识别第三方控件。尽可能采用js来处理,更显示稳定和高效
|、uiautomator监听处理android系统不确定的系统级别弹窗
④自动化测试实施项目选取策略:
|、重复性高且有必要的测试流程
|、项目周期长,系统版本不断,并且需求不会频繁变更项目
⑤自动化测试框架包括:
|、测试用例分布式执行:seleniumGrid
|、脚本模块化:分层
|、数据驱动:mysql存储数据,testng的数据提供者
|、日志分析:本地log4用例执行信息
|、错误截图:监听截图
|、报表回收:测试数据存储mysql数据库等
|、共享对象库/公共函数库:UI元素信息管理/UI元素操作方法维护
|、环境配置:chromedriver/adb/IEdrver/Firefoxdriver
|、用例统一设计模式:基类(测试用例beforeclass/afterclass),多用例集中于一个需求/模块里
|、异常处理:testngListenter监听,UIwater处理系统级弹窗
|、接口和mock结合介入
|、第三方工具引入:adb/shell/redis
|、用例执行方式(分布式测试seleniumGrid、device多并发测试)
自动化广义总结:
1、自动化测试工作不复杂但也不简单,其需要自动化测试人员既懂业务也懂技术。
2、对自动化测试看法过低以及对自动化测试要求太高,都是因为其盲目性,一个懂产品技术和自动化测试技术的工程师,是很快能定位其自动化测试需求和开展的方法。
3、每个公司有每个公司自己的特点,调研和需求分析很重要。
4、自动化测试框架不难,难的是细节。
5、自动化平台很重要,没有一个平台,不方便推广,其自动化测试只能流于形式。
补充:
自动化测试框架找对象:
通常每种框架都应该支持动态跟静态两种找对象的方式,静态找就涉及到对象库,包括对象库的读、写、合并、维护等一系列问题,这些都可以交给框架做;
关于动态查找,我举个RFT的例子,你们意会一下:
Two types of find API in Rational Functional Tester:
- find(Subitem Properties).
- find(Subitem Properties, Boolean mappableOnly).
Subitems can be either atChild() or atDescendant() or atList().
- atChild: One or more properties that must be matched against the direct child of the starting TestObject.
- atDescendant: One or more properties that can be matched against any child of the starting TestObject
- atList: A sequential list of properties to match against. Valid subitems for atList are atChild, atDescendant, and atProperty.
- mappableOnly: Arguments that limit the search. If it is set to true, the search for children will be limited to those test objects that are mappable, otherwise non-mappable test objects are also searched.
先测试工具会提供动态查找的接口或者方法,RFT里面提供的是find方法,调用这些接口或者方法即可实现动态查找。
动态查找的好处是可以采用“相对路径”来定位对象,而相对的,对象库则采用的是“绝对路径”。如果一旦对象的一些属性改变,静态查找的方式可能会找不到对象,当然了,现在的自动化测试越来越智能,已经可以做到选取匹配度最高的对象返回。动态查找还有个好处是它找到的对象是“代码”,你可以进一步在框架里去对这些对象进行处理,而对象库里的每一个对象都是一个独立的对象,你可以使用它们,但是很难改变它们。
通常现在的自动化测试框架都是采用动静结合的方式,即两种找对象的方式都会兼顾,因为一般来说,静态查找的方式速度更快,效率更高。但是静态查找带来的问题也是显著的,主要集中在对象的维护管理以及合并上,如何共享对象,避免重复加对象等。此时,规范对象命名就显得很重要了。以往我做的自动化测试项目中,这些都是坑。