自动化测试流程
一.需求分析
确定需求,看系统哪些模块适合做自动化,分析利弊
二.方案选择
选择常见的自动化测试框架,robotium,appium,monkeyrunner,UIautomator等
三.环境准备
搭建环境,要考虑所选择的框架及版本,持续集成,代码环境管理等问题
四.系统设计
主要是针对整个系统框架做合理设计,如各个公共模块的封装,文件管理,配置数据和日志管理
五.编码
根据事先设计好的用例来编写代码
自动化测试分类
分层测试
测试金字塔有3层:底层单元测试,中间接口测试,顶层UI测试,测试人员一般是在UI层测试
APP测试的难点在于UI常变,导致自动化用例需要大量维护
从分层测试的角度,自动化测试应该逐层进行
最大量实现自动化测试的应该是单元测试,最容易实现也最容易在早期发现问题
其次是接口测试,以验证逻辑为目的进行自动化,由于接口相对稳定,自动化测试成本相对可接受
自动化成本最大的就是UI自动化测试,然而UI界面是直接反馈给用户的效果展示,适度的尤其是冒烟测试级的自动化测试是必要的
被测操作系统的选择
可以参考:https://mta.qq.com/mta/data/device
https://tongji.baidu.com/research/app
可以参考上方的网站提供数据查看某时期的设备,品牌,操作系统,等的活跃情况。便于设置一个覆盖率较高的用例设备
app的三种类型与区别
原生应用程序:(Native App)
原生APP就是利用Android,IOS平台官方的开发语言、开发类库、工具进行开发。比如安卓的java语言,IOS的object-c语言,在应用性能上和交互体验上效果最好
优点:
1.可访问手机所有功能,可实现功能最齐全;
2.运行速度快,性能高,绝佳的用户体验;
3.支持大量图形和动画,不卡,反应快;
4.比较快捷的使用设备提供的端口,处理速度上有优势
缺点:
1.在过去主要是成本高、周期长,安卓和ios都需要单独开发
2.更新版本需要重新下载安装包
混合应用程序(Hybrid App)
利用了原生APP的开发技术还应用了HTML5开发技术(混合的比例不限)
优点:
1.开发周期短
2.功能更新发布快
缺点:
1.用户体验不如本地应用;
2.性能稍慢(需要连接网络);
web版app
本质就是浏览器功能的叠加,用普通web语言开发的,通过浏览器运行
优势:
1.支持范围广
2.开发成本低
缺点:
1.对联网要求高,离线不能做任何操作;
2.功能有限;
3.运行速度慢,页面不能承载太多东西;
4.图片和动画支持性不高;
5.如果用户使用更多的新型浏览器,那么就会出现运行问题
三种技术特性的对比:
还有一类比较特殊的就是手游APP
一般使用引擎开发,现在著名的有cocos2d和unity3d,两者都是使用引擎自带的语言进行开发,主流的分别是C++和C#,虽然在开发过程中也有按钮等控件的概念,但当运行时由引擎渲染后就变成了一幅简单的图片,不能使用appium定位
UI元素获取工具:
UIautomator和appium自带的appium inspect
UIautomator:
简介:
用来做UI测试,就是普通的手工测试,点击每个控件元素,看输出的结果是否符合预期(安卓官方文档有提示说它能使用的版本为Android 4.3就是API level18以上的版本)
相关工具:
UIautomationviewer - 一个图形界面工具来扫描和分析应用的UI控件,存放在tools目录
UIautomator - 一个测试的JAVA库,包含了创建UI测试的各种API和执行自动化测试的引擎
使用条件是SDK Tools版本>21,SDK Platform API > 18
注意事项:
1.版本要符合要求
2.设备保持亮屏状态,息屏可能获取不到元素信息
3.如果提示Remote object doesn’t exit,说明没获取到页面的xml信息,有两种解决方案
一是重启设备或重新连接,二是在获取到页面信息之后把信息保存到本地,下次再打不开的时候可查看本地保存下来的xml文件
Android模拟器
Android SDK自带的AVD
启动速度慢,响应速度慢
夜神模拟器
基于vitualbox,可一键多开,但目前只能支持安卓5和安卓7
逍遥模拟器
与夜神模拟器差不多,但支持的安卓版本有待确认
安装配置注意:
需要把bin目录添加到环境变量path中
需要开启VT
ADB 准备
常用的adb指令:
adb version ----- 查看adb版本
adb devices ----- 查看adb设备连接情况(若使用了模拟器,则打开模拟器就能使用该命令查到设备的连接情况)(夜神模拟器的端口号是有规律的,第一个模拟器端口是62001,第二个是62025,第三个是62025+1,以此类推)
adb tcpip 5555 ----- 开启5555端口用来无线连接
adb connect xxx.xxx.x.x 或者 adb connect xxx.xxx.x.x:5555 ----- 一般连接真机时用,IP地址是通过查看手机wifi配置信息可以查到的
adb shell ----- 进入手机的内部系统(Android设备的底层是linux系统,shell是linux的字符交互界面)
adb -s 127.0.0.1:62001 shell ----- 进入到指定设备的内部系统 (通过exit退出)(进入后#代表有root权限,$代表没有root权限)
adb install | -r <apkname> ----- -r 说明覆盖原安装文件
adb uninstall | -k <apkname> ----- 卸载软件(要先shell然后进入/data/app,找到APP的包名)-k参数表示卸载软件但是保留配置和缓存文件
adb shell 之后 pm list package ----- 查看设备上安装的应用包名
adb push <pcpath> <devicepath> ----- 把文件从PC写入设备
adb pull <devicepath> <pcpath> ----- 把文件从设备导进电脑中(由于权限原因,不能直接pull到电脑磁盘根目录,否则会报错)
adb shell screencap <devicepath> ----- 截图保存到设备的某个路径下,最好用png后缀的
adb start-server 和 adb kill-server ----- 开启和关闭adb服务
adb shell dumpsys window | findstr mCurrent ----- 获取刚刚启动的app的包名和activity名
netstat -ano | findstr 5037 ----- 查看端口占用情况(最后一列就是端口占用进程的PID)
tasklist /fi "PID eq 端口号" ----- 可以查看具体是哪个进程
taskkill /pid 端口号 ----- 可以杀掉进程
报错:
如果安装apk失败,可以shell进入后,cd到data文件夹下,chmod 777 local 然后再重新安装就可以了
如果卸载失败,要检查一下,因为安装后的包名系统会在末尾加上-1或-2之类的数字,要去掉才能成功卸载,且包名不要包含.apk
APP的Package和Activity
package是唯一的,可视为app的身份证号(xxx.apk是文件名,包名一般是以com开头的)
Activity是程序的根本,所有程序的流程都运行在activity之中,activity一般代表手机屏幕的一屏(手机类比浏览器的话,activity就相当于一个网页)acitivity中可添加button、checkbox等控件。activity之间可以相互跳转,例如按下一个button按钮,可能会跳转到其他activity,且activity之间的跳转可能有返回值【activity的生命周期:产生,运行,销毁。其中会调用很多方法,如创建onCreate,激活onStart,停止onStop等】
activity页面布局元素
FrameLayout
最简单的布局。所有放在布局里的控件,都按照层次堆叠在屏幕的左上角,后加的控件覆盖前面的控件。
LinearLayout
按照垂直或水平的顺序依次排列子元素,每一个子元素都在前一个元素之后。
如果垂直排列,那么将是一个N行单列的结构,每一行只有一个元素,而不论这个元素的宽度有多宽;
如果水平排列,那么将是一个单行N列的结构。
如果搭建两行两列的结构,通常的方式是先垂直排列两个元素,每一个元素里再包含一个LinearLayout进行水平排列
RelativeLayout
相对布局允许子元素指定他们相对于其父元素或兄弟元素的位置,实际布局常用这种方式
AbsoluteLayout
绝对位置布局,通常不采用
TableLayout
表格布局,试用N行N列的布局格式
TextView
显示文字
Appium相关
运行原理
在电脑(client)上运行自动化测试脚本,调用的是webdriver的接口,appium server接收到我们client上发送过来的命令后他会将这些命令转换为UIautomator认识的命令,然后由UIautomator在设备上执行自动化
appium的架构在博客中相关文章有介绍,由客户端和服务器组成,他们之间通过JSON Wire Protocol进行通信
appium服务器
是基于Node.js实现的HTTP服务器,用于接收客户端发起的连接,监听客户端发送来的命令,把命令发送给bootstrap.jar(ios是.js)执行,再将结果通过http应答反馈给Appium客户端
Bootstrap.jar
是在安卓手机上运行的一个程序,它在手机上扮演TCP服务器的角色。当Appium服务器需要运行命令时,appium服务器会与bootstrap.jar建立TCP通信,并把命令发送给Bootstrap.jar ; Bootstrap.jar负责运行测试命令
Appium客户端
主要是实现了Appium功能的WebDriver协议的客户端Library,它负责与appium服务器建立连接,将测试脚本的指令发送到appium服务器。
组件:
Appium-server
appium的服务端,一个web接口服务,使用Node.js实现
$ npm install -g appium
$ appium
Appium Desktop
适用于Mac,Windows和Linux的开源应用程序,是个有界面的Appium-server,结合了appium-server和相关工具的集合
其中就有inspector,可以用来查看app的元素,获取基本信息,并与他们进行基本的交互