一、移动端测试简介
1. 1 移动端测试定义
- 移动端测试指的是对移动应用进行测试,即实体的特性满足需求(产品文档、隐性需求等)的程度
1.2 移动端测试分类
1.2.1 app功能测试
1. 业务逻辑正确性测试
- 产品文档
- 隐性需求
=编写=>测试用例
2. 兼容性测试
提示:
- 移动设备大数据查询
移动观象台
名称 | 说明 |
---|---|
系统版本 | ➢ Android 官方、联想、华为等 ➢ IOS 官方 |
分辨率 | ➢720p720x1280 ➢ 1080p 1080x1920 ➢ 2k 2560x1440 |
网络情况 | ➢ 2G ➢ 3G ➢ 4G ➢ Wi-Fi |
3. 异常测试
- 热启动应用
应用置于后台 =切换=> 前台的过程 - 网络切换&中断恢复
- 电话或信息中断恢复
4. 升级、安装、卸载测试
(1) 升级
系统升级、渠道升级、临近版本(1.0->1.1) 、跨版本(1.0->1.5)
(2) 安装
系统版本、首次安装、覆盖安装、卸载后安装
(3) 卸载
卸载->安装->卸载
5. 健壮性测试
- 手机资源消耗
CPU、内存 - 流量消耗
图片、传输数据压缩 - 崩溃恢复测试
闪退、报错(停止运行) - ...
1.2.2 app自动化测试
- 通过场景和数据的预设,把以人为驱动的测试行为转化为机器执行的一种过程
- 重复的工作交给机器去做
- 解放出一些人去做新功能测试和探索性测试
提醒:
- 并不是所有功能都能进行自动化
- 新功能(不稳定)或很难通过脚本模拟的业务
1.2.3 app安全测试
- 通过安全测试技术,保证app尽可能的不存在安全漏洞
二、移动端测试环境搭建
参阅:
2.1 安装JAVA
2.2 安装SDK
- 自动化测试获取taost消息时需要对应系统版本的Android SDK Build-tools
2.3 安装模拟器
参阅:
三、ADB命令
3.1 ADB
Andorid Debug Bridge
- 一个Debug工具
- 为何称之为Bridge?
因为adb是一个标准的C/S结构的工具, 是要连接开发电脑和调试手机的
包含如下几个部分:
- Client端
运行在开发机器中,即你的开发PC机;用来发送adb命令 - Daemon
守护进程, 运行在调试设备中, 即调试的手机或模拟器 - Server端,
作为一个后台进程运行在开发机器中, 即你的开发PC机. 用来管理PC中的Client端和手机的Daemon之间的通信
- 三者之间的通信
Client<—>Server<—>Daemon
3. 2 ADB基本命令
名称 | 命令 |
---|---|
ADB | |
adb帮助 | adb --help |
启动adb server | adb start-server |
关闭adb server | adb kill-server |
获取设备号 | adb devices |
获取系统版本 | adb shell getprop ro.build.version.release 只有一个设备就可以省略 -s 设备号 |
ADB与手机 | |
查看手机运行日志 | adb logcat |
手机shell命令行 | adb shell top |
发送文件到手机 | 格式:adb push 电脑端文件路径/需要发送的文件 手机端存储的路径 eg: 将桌面的6809.bmp发送到手机/sdcard目录下 adb push 6809.bmp /sdcard |
从手机拉取文件 | 格式: adb pull 手机端的路径/拉取文件名 电脑端存储文件路径 eg: 将手机/sdcard目录中的xx.png文件发送到电脑桌面 adb pull /sdcard/001.jpg C:UserszifengDesktop |
获取app启动包名和启动名 | 手机需要先打开对应app 1. Mac/Linux adb shell dumpsys window windows | grep mFocusedApp 或 adb shell dumpsys window windows | grep mFocusedApp | cut -d " " -f 7 2. Windows 提示:看mFocusedApp这一行的内容 adb shell dumpsys window windows |
安装app到手机 | adb install 路径/xx.apk |
卸载手机app | adb uninstall 包名 |
获取app启动时间 | 格式:adb shell am start -W 包名/启动名 eg: TotalTime:app自身启动时间 WaitTime:系统启动应用时间 |
四、主流的移动端自动化工具
- 自动化工具选择的关注点
➢ 1. 是否支持native,webview
➢ 2. 是否支持获取toast
➢ 3. 是否支持跨应用
工具名 | 支持语言 | 支持系统 | 支持跨应用 |
---|---|---|---|
Robotium | Java | Android | 不支持 |
Macaca | Java、Python、Node.js | Android、iOS | 支持 |
Appium | Java、Python、Node.js C#、php、perl、ruby |
Android、iOS | 支持 |
4.1 Appium
Appium是由nodejs的express框架写的Http Server,Appium使用WebDriver的json wire协议,来驱动Apple系统的UIAutomation库、Android系统的UIAutomator框架
- 支持语言:Java、C#、Python、php、perl、ruby、Node.js
- 支持Android和iOS系统
- 支持跨应用
4.1.1 Appium环境搭建
1. 安装Appium
第一种方式:桌面客户端
平台 | 地址 |
---|---|
Appium客户端 | https://github.com/appium/appium-desktop/releases |
配置
提示:
- ANDROID_HOME为SDK Manager的安装路径
运行Appium
第二种方式:命令行
参阅:
1. 安装Node.js
提示:
- Windows
http://nodejs.cn/download/
- Linux:
yum install
- Macos:
brew install
查看是否安装成功
npm -v
或
node -v
2. 安装cnpm
npm install -g cnpm --registry=https://registry.npm.taobao.org
提示:
- npm国内一般被墙,所以选择淘宝镜像安装,官网- http://npm.taobao.org
3. 安装appium
cnpm install -g appium
提示:
- Windows安装会提示os的模块错误,这个需要mac系统支持,不影响Windows操作使用
参阅:
4. 配置appium
- 修改默认地址
C:UsersXXXAppDataRoaming pm ode_modulesappiumuildlibparser.js
- 配置环境变量
需要在"此电脑->属性->高级系统设置->环境变量"中配置环境变量
ANDROID_HOME
=SDK Manager所在的安装路径
5. appium-doctor(可选)
检查appium所有配置是否正确,正确表示安装和配置成功
cnpm install -g appium-doctor
appium-doctor
6. 启动appium服务
appium &
启动参数 | 说明 | 另一种写法 |
---|---|---|
-a |
指定监听的ip | --address |
-p |
指定监听的端口,也可以修改为你需要的端口 | --port |
--session-override |
指覆盖之前的session | |
-bp |
是连接Android设备bootstrap的端口号,默认是4724 | --bootstrap-port |
--chromedriver-port |
chromedriver运行指定的端口号,默认是9515 | |
-U |
连接的设备的设备号,获取方式:adb devices |
--udid |
eg:
appium -a 127.0.0.1
或
appium -a 127.0.0.1 -p 4723 -bp 4728 --chromedriver-port 9519 -U xiaomi --session-override
参阅:
2. 安装Appium-python库
第一种方式:命令行
pip install Appium-Python-Client
或
pip3 install Appium-Python-Client
第二种方式:安装包
前提:python已安装setuptools包
-
安装setuptools
(1)解压setuptools-38.2.4.zip
(2)进入解压后文件夹执行命令: python setup.py install
(3)等待安装完成,无错误信息即可 -
安装Appium-Python-Client
(1)解压Appium-Python-Client-0.47.tar.gz
(2)进入解压后文件夹执行命令: python setup.py install
(3)等待安装完成,无错误信息即可
4.1.2 脚本测试
1. 脚本语法
- 手机驱动对象
驱动对象会帮助我们完成手机和脚本之间交互 - 导入driver对象
from appium import webdriver
- 声明手机驱动对象
提示:
- 只有声明驱动对象我们才可以让手机完成脚本的操作
#声明对象后会直接启动参数中的应用
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
提示:
- wd即webdriver
- hub与分布式相关,代表中心节点
- 手机启动参数
desired_caps
负责启动服务端时的参数设置,appium server 与手机端建立会话关系时,根据这些参数服务端可以做出相应的处理
desired_caps常用参数 | 说明 |
---|---|
platformName |
平台的名称 iOS、Android、 FirefoxOS |
platformVersion |
设备系统版本号 |
deviceName |
设备号 IOS instruments -s devices Android adb devices |
app |
安装文件路径/abs/path/to/my.apk 或http://myapp.com/app |
appActivity |
启动的Activity |
appPackage |
启动的包 |
unicodeKeyboard |
unicode设置(允许中文输入) |
resetKeyboard |
键盘设置(允许中文输入) |
#server启动参数
desired_caps = {}
#设备信息(系统、版本、设备号)
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '5.1'
desired_caps['deviceName'] = '192.168.56.101:5555'
#app信息(包名、启动名)
desired_caps['appPackage'] = 'com.android.settings'
desired_caps['appActivity'] = '.Settings'
desired_caps['unicodeKeyboard'] = True
desired_caps['resetKeyboard'] = True
- 脚本内启动其他app
driver.start_activity(appPackage,appActivity)
- 关闭app
# 关闭当前操作的app,不会关闭驱动对象
driver.close_app()
- 关闭驱动对象
# 关闭驱动对象,同时关闭所有关联的app
driver.quit()
2. 示例脚本
功能:打开设置并点击搜索按钮
准备:
- 运行Appium软件并开启服务(appium服务器)
客户端:直接运行并修改host为127.0.0.1
命令行:appium &
- 启动模拟器中的系统(移动端)
- 运行Pycharm(自动化测试脚本)
from appium import webdriver
import time
# server 启动参数
desired_caps = {}
# 设备信息(系统、版本、设备号)
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '9'
desired_caps['deviceName'] = '192.168.72.103:5555'
# app信息(包名、启动名)
desired_caps['appPackage'] = 'com.android.settings'
desired_caps['appActivity'] = '.Settings'
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
time.sleep(5)
driver.quit()
提示:
- desired_caps['platformVersion']值获取
adb shell getprop ro.build.version.release
- desired_caps['deviceName'] 值获取
adb devices
参阅: