TalkingData 移动观象平台
App 功能测试
业务逻辑正确性测试:一句产品文档设计测试用例,加上隐性需求用例
兼容性测试:
系统版本:
android :4.4 5.0 6.0 7.0
屏幕分辨率:
720 * 1280, 1920*1080 图片(根据分辨率做一些图片)
网络状态:
2g,3g,4g,5g wifi
异常测试:
热启动应用:应用由后台转换为前台的过程
考虑:1.仍然展示退到后台时的页面
2.希望初始化首页
网络切换和终端回复
1.网络切换:wifi->2g , 4g->3g 应用正常可用状态
2.终端恢复:4g->断网->4g,(下载2M 应用,1M断网.恢复网络(断点续传))
电话和信息中断恢复
电话:看视频->电话接10分钟->返回视频 app
信息:玩游戏->通知栏一个消息->不影响游戏体验
升级安装卸载测试:
升级: 临近版本升级(1.0>1.1)
跨版本升级(1.0->1.7)
保证升级后App可用状态
安装测试: 首次安装
卸载后安装
覆盖安装
保证app安装后可用,安装文件齐全?
卸载测试: 正常卸载
卸载后安装再卸载
保证卸载后,需要清理的文件全部清空,需要保留的文件存在
健壮性测试:
手机资源消耗:cpu,内存,耗电测试
流量消耗:数据流量,加载图片瞬间小号20M 图片压缩,数据压缩
崩溃恢复: app闪退,提示终止运行等等,保证自启动可用,手动启动可用
App 自动化测试
通过场景和数据的预设,把以认为驱动的测试行为转化为机器执行的一种过程
并不是所有功能都能进行自动化
例子: app 设计 500 条测试用例 2个人 5天 用例中有300条是主流业务可以通过脚本实现完成
优点:
-
高效
-
不需要人工干预
-
回归测试
安全测试: 通过一些安全测试工具
2.1 主流的移动端自动化工具
-
Robotium
-
支持语言 Java
-
仅 Android 系统
-
不支持跨应用
-
-
Macaca
-
支持语言:Java,Python,Node.js
-
Android,iOS
-
支持跨应用
-
-
Appium 开源
-
支持语言: Java,C#,Python, php, perl, ruby, Node.js
-
Android ,iOS
-
支持跨应用
-
自动化工具的关注点
-
是否支持native,webview
-
是否支持获取toast
-
是否支持跨应用
2.2 Appium 环境搭建
2.2.1 Appium 客户端安装
2.2.1.1 Appium 背景介绍
-
官网: www.appium.io ,由SauceLab 公司开发
-
Appium 是由nodejs 的express框架编写的Http Server,Appium 使用WebDriver 的json wire 协议,来驱动 Apple 系统的UIAutomation,Android 系统的UIAutomator
2.2.1.2 安装方式
1.运行 Appium-desktopx........1.2.7.exe
Host:127.0.0.1
Port:4723
2.2.2 Appium-python 库安装
-
命令行安装
pip install Appium-Python-Client
-
安装包安装
前提:python 已安装 setuptools 包
安装setuptools :
-
解压setuptools-38.2.4.zip
-
进入解压后文件夹执行:python setup.py install
-
等俺安装完成无错误信息即可
安装Appium-Python-Client
-
解压Appium-Python-Client-0.25.tar.gz
-
进入解压后文件夹执行命令:python setup.py install
-
等待安装完成,无错误信息即可
-
bootstrap.jar-->UIAutomator(官方自动化测试框架)
android 模拟器:https://www.genymotion.com/download
-
声明手机驱动对象
只有声明驱动对象我们才可以让手机完成脚本的操作
driver = webdriver.Remote(‘http://127.0.0.1:4723/wd/hub‘,desired_caps)
# 手机启动参数
desired_caps: 负责启动服务端时的参数设置,appium server 与手机端建立会话关系时,
脚本内启动其他app
driver.start_activity(appPackage,appActivity)
关闭app
driver.close_app() #关闭当前操作的app,不会关闭驱动对象
关闭驱动对象
driver.quit()
关闭服务:adb kill-server
获取设备号:adb devices
获取系统版本:adb shell getprop ro.build.version.release
?
发送文件到手机:adb push 电脑端文件存储路径 手机端要存储路径
拉取文件从手机:adb pull 手机端存储文件路径 电脑端需要存储路径
?
查看手机运行日志: adb logcat | grep 包名
?
手机shell 命令行: adb shell
?
获取app包名和启动名(手机必须打开对应app):adb shell dumpsys window windows | grep mFocusedApp
?
安装apk到手机: adb install ,apk文件存储路径
卸载app从手机: adb uninstall 包名
?
获取app启动时间: adb shell am start -W 包名/启动名
TotalTime:app 自身启动时间
WaitTime:系统启动应用时间
安装apk:
driver.install_app("apk所在路径")
卸载app:
driver.remove_app("nameless.cp")
判断app是否安装在手机(存在返回True,不存在返回False)
boolean = driver.is_app_installed("nameless.cp")
判断通讯录:
boolean = driver.is_app_installed("com.android.contacts")
发送文件到手机:
imprt base64
?
with open(".test.txt",‘r‘) as f:
data = str(base64.b64encode(f.read().encode(‘utf-8‘)),‘utf-8‘)
driver.push_file(path,data)
参数:
path: 手机设备上的路径(例如:/sdcard/a.txt)
data: 文件内数据,要求base64编码
Python3.x 中字符都为unicode编码,而b64encode函数的参数为byte类型,需要先转码;生成的数据为byte类型,需要将byte转换回去.
从手机中拉取文件数据
import base64
data = driver.pull_file(path) #返回数据为base64编码
print(str(base64.b64decode(data),‘utf-8‘)) #base64编码
参数:
path:手机上的路径
拉取手机上文件数据并复制生成文件到电脑端
from appium import webdriver
from time import sleep
import base64
?
# 启动参数
desired_caps = {}
# 设备信息
desired_caps[‘platformName‘] = ‘Android‘
desired_caps[‘platformVersion‘] = ‘7.0‘
desired_caps[‘deviceName‘] = ‘hePhone‘
?
# 相关操作 app信息
desired_caps[‘appPackage‘] = ‘com.android.launcher3‘
desired_caps[‘appActivity‘] = ‘.Launcher‘
?
# 声明手机驱动对象
driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_caps)
?
sleep(1)
#
# driver.start_activity("com.android.contacts",".activities.PeopleActivity")
#
# sleep(3)
#
# #关闭app
# driver.close_app()
?
# with 文件操作的方法
# 发送电脑端文件到手机上
# with open("./heheda.txt", ‘r‘) as f:
# data = str(base64.b64encode(f.read().encode(‘utf-8‘)), ‘utf-8‘)
# driver.push_file("/sdcard/heheda.txt", data)
?
# #拉取手机上文件数据
# data= driver.pull_file("/sdcard/heheda.txt")
# da = str(base64.b64decode(data),"utf-8")
# print(da)
?
#拉取手机上文件数据并复制生成文件到电脑端
data = driver.pull_file("/sdcard/heheda.txt")
newf = open(‘gegeda.txt‘,‘w‘)
newf.write(str(base64.b64decode(data),‘utf-8‘))
newf.close()
?
?
?
sleep(1)
driver.quit()
capabilities 启动参数列表 (网上查)
API 基础获取屏幕内元素
获取当前屏幕内元素结构
driver.page_source