背景
一个App安装在一台设备上,总是闪退、屏幕热、机身热、设备卡死甚至崩溃等现象,直接影响用户使用功能或者用户卸载App,最终的结果是流失用户群里。
项目迭代中,一般会对每个版本的App进行稳定性测试,在正式发布前拦截Crash。而稳定性测试方案中对于测试工具的选型方案是决定了发现Crash问题的可能性。
本文会从稳定性测试工具切入,介绍新一代稳定性测试利器Fastbot如何在项目中使用。
工具对比
4款常见Android稳定性测试工具对比
1、Google Monkey
首先来看业界用的较早也是经常听过的一款工具—— Monkey。这是 Android 官方提供的一个工具。谷歌原本设计这款工具是为了对 App 进行压力测试的。
谷歌早期在设计 Android 的时候,Android 需要响应滑动、输入、音量、电话等事件,早期 activity 设计不完善的时候,谷歌希望测试 activity 的性能,
把所有的数据批量化的输出给 activity,activity 一秒钟可以处理多少数据。所以早期 Monkey 是用来做 Android 的一个压力测试的工具。
由于 Monkey 在测试过程中的“随机”性,恰巧可以被用来做自动遍历测试,但是 monkey 的缺点很明显,不支持业务行为定制,
无法灵活的控制,经常会点到外部的 App 无法回归原测试 App;或者点击到注销和退出,造成无法继续后面的测试;
因此monkey在经过调研了解后没有成为我们做稳定性测试的首选。
Monkey 官方链接:
https://developer.android.com/studio/test/monkey
2、AppCrawler
AppCrawler 官方 GitHub 上对这款工具的解释是:
一个基于自动遍历的 App 爬虫工具。支持 Android 和 iOS,支持真机和模拟器。最大的特点是灵活性,可通过配置来设定遍历的规则。 这里顺便提一下的是谷歌也发布了一款自动遍历的工具,名字几乎一样,叫做 App Crawler (差了一个空格),设计的思想也一致。思寒开源的的工具比谷歌早了两年时间。
下面来看看 AppCrawler 的作用和价值。看看它为何满足我们的测试需求,它的优缺点又在哪里。
优点:
- 跨平台性:AppCrawler 是基于 Appium 开发的,所以支持 Android、iOS、Web以及GUI
- 灵活定制:对遍历的页面、控件、事件、深度等都可自由控制
缺点:
- 运行速度较慢:AppCrawler 是基于 Appium 开发具备了跨平台的优点,但是也因为这层封装造成了运行速度相对较慢,再加上运行过程中加入了截图(可以在配置中取消,但是取消后不利于结果的查看),运行起来自然就慢了;
- 使用门槛高:正因为使用灵活性的问题,也造成了使用门槛的提高,主要基于 YAML 文件中使用 Appium 的相关技术知识进行配置,这就对使用者有了一定的技术要求;
3、Maxim自动化遍历
Maxim 也是一款自动遍历工具,由国内的 zhangzhao 同学开发,官方给出的定义是:
An efficient Android Monkey Tester, available for emulators and real devices 基于遍历规则的高性能 Android Monkey,适用于真机/模拟器的 APP UI 压力测试。
我们来看看这款工具的优缺点:
优点:
- 基于Monkey二次开发,运行速度非常快
- 提供了多种遍历算法以提高覆盖度
- 提供了定制化功能,可以实现流程控制
缺点:
- 因为是基于 Monkey,所以不具备跨平台性,只能测试 Android,不能测试 iOS,Web 等;
这是一款很优秀的工具,可在一定程度上进行定制,如果只测试 Android 系统的话,可以考虑选用 Maxim 做稳定性测试。
官方 GitHub 地址:
https://github.com/zhangzhao4444/Maxim
4、Fastbot稳定性测试工具
Fastbot是字节跳动的QualityLab团队开发的一款融合了机器学习与强化学习的基于模型测试的工具。
Fastbot可以理解为MaxIM的升级版,为了增强覆盖,融合了多种机器学习、强化学习等相关的算法。他的执行速度很快,并显著提升了测试覆盖度。应用的效果也是非常不错的。
目前,Fastbot 已广泛应用于字节客户端类产品的稳定性测试与兼容性测试。每日启动任务数超过 300 次,每日平均发现 5000 个以上的崩溃,并有超过 100 个新捕获的崩溃。借助 Fastbot 的能力,我们在发版前就可以修复大部分的crash,确保线上用户的使用体验。同时,Fastbot 在整个 DevOps流程扮演重要的基础服务角色。
Fastbot
工具介绍
基于model-based testing 结合机器学习、强化学习的APP 稳定性测试工具
优势:
- Android多os兼容: 同时兼容Android5-12,兼容国内各厂商定制化的Android系统及原生Android系统
- 事件快速注入: 继承原生Monkey的优势,快速点击,每秒最高可发送12个事件
- 专家系统: 不同业务线支持不同的个性化需求,业务深度定制化
- 智能化测试: 基于model-based 边遍历边建模,利用强化学习等算法做高收益决策
- 跨平台: 支持非标准化控件,YOLOv3、ocr、cv分割等UI图像识别能力
官方GitHub地址:
https://github.com/bytedance/Fastbot_Android
工具环境
这里使用mac环境作为搭建环境,由于手头没有win电脑,还请自行百度查看win搭建环境教程。
安装adb
代码语言:javascript复制brew install android-platform-tools --cask
android sdk
代码语言:javascript复制brew install android-sdk
brew install --cask homebrew/cask-versions/temurin8
aapt
环境变量配置
代码语言:javascript复制AAPT_HOME=/Users/xinxi/Library/Android/sdk/build-tools/25.0.0
export AAPT_HOME
export PATH=$PATH:$AAPT_HOME
验证aapt
代码语言:javascript复制(base) hxyhome:~ xinxi$ aapt v
Android Asset Packaging Tool, v0.2-4507799
测试设备
支持Android 5,6,7,8,9,10,11,12 真机及模拟器,由于FastBot执行很快,低端机执行时间长了以后会发生OOM,推荐使用Android10以上并且性能比较好的设备。
测试依赖
首先需要从github下载依赖包,https://github.com/bytedance/Fastbot_Android。
image
然后,将framework.jar、fastbot-thirdpart.jar、monkeyq.jar push 到手机上某个目录中,建议/sdcard,push libs/* 到 /data/local/tmp/。
执行命令如下:
代码语言:javascript复制adb push *.jar /sdcard
adb push libs/* /data/local/tmp/
入门演示
我们使用B站客户端作为演示对象,可以在应用市场下周安装。
使用"adb shell pm list package"命令查看B站的包名,"tv.danmaku.bili"。
运行命令:
代码语言:javascript复制adb -s LMG900UMdeaceb63(设备号) shell
CLASSPATH=/sdcard/monkeyq.jar:/sdcard/framework.jar:/sdcard/fastbot-thirdpart.jar exec app_process /system/bin com.android.commands.monkey.Monkey
-p tv.danmaku.bili(包名)
--agent reuseq
--running-minutes 5(遍历时长)
--throttle 500(事件频率) -v -v
参数说明
- -s 设备号 多个设备需要指定设备号,单独设备无需此-s参数
- -p 包名 遍历app的包名,-p 包名
- --agent reuseq 遍历模式,无需更改
- --running-minutes 遍历时长(分钟) # 遍历时间:--running-minutes 时间
- --throttle 事件频率 遍历事件频率,建议为500-800
- 可选参数
- --bugreport 崩溃时保存bug report log
- --output-directory /sdcard/xxx log/crash 另存目录
打开一个命令行终端后执行上面的命令,屏幕出现"FastBot"说明启动成功 。
在执行完成后,会打印出来执行覆盖过的页面。
Activity覆盖率统计:
- 正常跑完Fastbot会在当前shell中打印totalActivity(总activity列表),ExploredActivity(遍历到的activity列表)以及本次遍历的总覆盖率
- 总覆盖率计算公式:coverage = testedActivity / totalActivities * 100
捕获Crash、ANR演示
为了更好演示捕获Crash、ANR,需要来模拟Crash、ANR的发生。
这里使用AndroidStudio写一个简单App,制造一个常见的"数组越界"导致Crash问题。
App页面中,点击右下角按钮后会崩溃。
目前为止,我们已经准备好被测App环境了,重新执行命令试下。
执行命令如下:
代码语言:javascript复制adb -s LMG900UMdeaceb63(设备号) shell CLASSPATH=/sdcard/monkeyq.jar:/sdcard/framework.jar:/sdcard/fastbot-thirdpart.jar exec app_process /system/bin com.android.commands.monkey.Monkey -p com.example.crashapplication(包名) --agent reuseq --running-minutes 5(遍历时长) --throttle 500(事件频率) -v -v
捕获到Java Crash、ANR、Nativie Crash会以追加方式写入/sdcard/crash-dump.log文件,查看crash-dump.log文件。
查看crash文件命令:
代码语言:javascript复制adb shell
cat /sdcard/crash-dump.log
需要注意的是crash-dump.log文件是每次增量写入的的,所以需求每次执行前把crash-dump.log清空再执行。
自动化脚本
在实际工作中,一般会把稳定性测试搞成自动化执行。我们可以把Fastbot提供的能力封装成shell脚本,方便在持续集成中运行。
由于shell脚本代码比较多,这里截了代码片段图,如果需要源码可以关注公众号获取。
自动化流程逻辑:
命令行执行:
代码语言:javascript复制sh monkey.sh -p com.xxx.xxx(包名) -t 5(执行时间)
jenkins持续集成
我们利用jenkins 自动化脚本,就可以自动化的稳定性测试,一般对于自动化稳定性测试有两种方案:
- 每天定时主动执行自动化测试
- 客户端构建完成后构建自动化测试
这里我们主要讲下每天定时主动执行自动化测试这种方案。
首先,在云服务搭建jenkins的并且设置为master,把本地mac电脑连接到master设置成agent节点。
配置一个jenkins任务,把自动化脚本放到github上并且每次执行都从github拉取最新的代码,在构建触发器配置定时器"每天晚上23点"执行。
任务配置完成后,点击构建或者定时触发构建,在日志页面输出如下信息,说明执行成功。
image
总结
本文介绍了稳定性测试Fastbot工具的使用。Fastbot还有很多功能,可以查看官方文档使用:https://github.com/bytedance/Fastbot_Android/blob/main/handbook-cn.md。