Fastbot_Android本地接入
介绍
基于 Model-based Testing 结合机器学习、强化学习的APP 稳定性测试工具
原文:https://github.com/bytedance/Fastbot_Android/blob/main/handbook-cn.md
优势
- Android 多 os 兼容:
同时兼容 Android 5~14,兼容国内各厂商定制化的 Android 系统及原生 Android 系统; - 事件快速注入:
继承原生 Monkey 的优势,快速点击,每秒最高可发送 12 个事件; - 专家系统:
不同业务线支持不同的个性化需求,业务深度定制化; - 智能化测试:
基于 Model-based 边遍历边建模,利用强化学习等算法做高收益决策;
环境预备
- 支持 Android 5,6,7,8,9,10,11,12,13,14 真机及模拟器
将
framework.jar fastbot-thirdpart.jar monkeyq.jar
push 到手机上某个目录中,建议/sdcard,pushlibs/*
到/data/local/tmp/
adb push *.jar /sdcard adb push libs/* /data/local/tmp/ # 如果不行就一个一push
push 配置文件
adb push abl.strings /sdcard
启动 Fastbot
adb -s 设备号 shell CLASSPATH=/sdcard/monkeyq.jar:/sdcard/framework.jar:/sdcard/fastbot-thirdpart.jar exec app_process /system/bin com.android.commands.monkey.Monkey -p 包名 --agent reuseq --running-minutes 遍历时长 --throttle 事件频率 -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 另存目录
自定义可执行文件bat
部分参数需要根据实际情况修改
set folderName0=%date:~0,4%%date:~5,2%%date:~8,2%
set folderName1=%time:~0,2%%time:~3,2%%time:~6,2%
adb shell mkdir -p /storage/emulated/0/Monkey/log/%folderName0%
adb shell CLASSPATH=/sdcard/monkeyq.jar:/sdcard/framework.jar:/sdcard/fastbot-thirdpart.jar exec app_process /system/bin com.android.commands.monkey.Monkey -p com.xxxx.consumer --agent reuseq --running-minutes 2 --throttle 500 -v -v -v --output-directory /storage/emulated/0/Monkey/xxxxyReport/%folderName0%/%folderName1% >D:/xxxxReport%folderName1%.txt
结果说明
Crash、ANR 捕获
- 捕获到Java Crash、ANR、Nativie Crash会以追加方式写入/sdcard/crash-dump.log文件
- 捕获的Anr 同时也会写入
/sdcard/oom-traces.log
文件
Activity覆盖率统计
- 正常跑完Fastbot会在当前shell中打印totalActivity(总activity列表),ExploredActivity(遍历到的activity列表)以及本次遍历的总覆盖率
- 总覆盖率计算公式:
coverage = testedActivity / totalActivities * 100
自定义配置
totalActivities:通过framework接口 PackageManager.getPackageInfo 获取,这包含app中所有的Activity,其中也包含了很多废弃、不可见、不可达等Activity
常用的自定义事件(待补充...)
场景细粒度控制
手动配置黑、白名单配置
适用需求 单独覆盖几个场景或屏蔽一些不必要场景
Activity白名单配置(只覆盖白名单内的activity)
- 在PC端新建
awl.strings
文件(名称固定为:awl.strings) 在文件中写入Activity的名称,例如
com.xxxx.consumer.env.ui.EnvActivity com.xxxx.auth.gatewayauth.LoginAuthActivity com.xxxx.consumer.login.ui.activity.LoginActivity
- 在PC端新建
将
awl.strings
文件push到手机端的sdcard目录下, 目录必须为sdcardadb push awl.strings /sdcard
运行命令时添加以下参数:
--act-whitelist-file /sdcard/awl.strings
adb -s 设备号 shell CLASSPATH=/sdcard/monkeyq.jar:/sdcard/framework.jar:/sdcard/fastbot-thirdpart.jar exec app_process /system/bin com.android.commands.monkey.Monkey -p 包名 --agent reuseq --act-whitelist-file /sdcard/awl.strings --running-minutes 遍历时长 --throttle 事件频率 -v -v
Activity黑名单配置(黑名单内的activity不覆盖)
- 在PC端新建
abl.strings
文件(名称固定为:abl.strings) - 在文件中输入Activity的名称,同白名单方法一致
将
abl.strings
文件push到手机端的sdcard目录下, 目录必须为sdcardadb push abl.strings /sdcard
运行命令时添加以下参数:
--act-blacklist-file /sdcard/abl.strings
adb -s 设备号 shell CLASSPATH=/sdcard/monkeyq.jar:/sdcard/framework.jar:/sdcard/fastbot-thirdpart.jar exec app_process /system/bin com.android.commands.monkey.Monkey -p 包名 --agent reuseq --act-blacklist-file /sdcard/abl.strings --running-minutes 遍历时长 --throttle 事件频率 -v -v
- 在PC端新建
注意: 白名单和黑名单不能同时设置,按照非白即黑的原则,即设置了白名单则白名单外的都为黑名单。通过hook 可以监控activity 启动和切换,如果启动的是黑名单中的activity,就拒绝启动该activity,从ui上看就是点了跳转没效果
屏蔽控件或区域
手动配置需要屏蔽的控件或区域
适用需求: 测试过程中“半路”中途退出登录,屏蔽退出登录按钮
黑控件、黑区域
- 在PC端新建
max.widget.black
文件(名称固定为:max.widget.black),文件内容配置格式如下:
[ { "activity": "com.XXX.XXX.main.activity.XXXMainActivity", "xpath": "//*[@resource-id='com.XXX.customer:id/float_icon_id']" } ]
- 在PC端新建
- 匹配条件activity:当activity与currentactivity一致时执行如下匹配
屏蔽控件或区域共有三种方式:
- 配置bounds:屏蔽某个区域,在该区域内的控件或坐标不会被点击,bounds 为 0.0~1.0 之间的一个百分比值。
- 配置xpath:查找匹配的控件,屏蔽点击该控件。
- 配置xpath+bounds:查找匹配的控件,当控件存在时屏蔽指定的区域,bounds 为 0.0~1.0 之间的一个百分比值。。
将max.widget.black文件push到手机端的sdcard目录下,目录必须为sdcard
adb push max.widget.black /sdcard
树剪枝屏蔽
- 在PC端新建
max.tree.pruning
文件(名称固定为:max.tree.pruning),文件内容配置格式如下: - 匹配条件activity:当activity与currentactivity一致时执行如下匹配
剪枝方式:
- 配置xpath:查找匹配的控件,改变控件属性,从而使控件屏蔽
- 将
- 在PC端新建
```
max.tree.pruning
```
文件push到手机端的sdcard目录下, /sdcard # 目录必须为sdcard
```
adb push max.tree.pruning /sdcard
```
常见问题(待补充...)
本地测试时,手机的顶部状态栏找不到了,怎么恢复呢?
答:
adb shell wm overscan reset
ps: 为了防止测试时点击到设置,影响测试效果,做的特殊设置小米手机运行 Fastbot 报错?
Injecting input events requires the caller (or the source of the instrumentation, if any) to have the INJECT_EVENTS permission
答:开启 “开发者选项” -> "USB调试(安全设置)允许通过usb调试修改权限或模拟点击"
运行Fastbot时无任何log,启动后就退出?
答:需检查/sdcard/是否存在
monkey.jar fastbot-thirdpart.jar framework.jar
。`部分机型发现adb push过去monkey.jar 自动被更名成monkey. 导致无法运行。vivo7.1运行Fastbot报错?
答:关闭锁屏和开启usb模拟点击即可。
oppo运行Fastbot 1.0模式报错?
答:oppo存在权限监控,需要在开发者-> 开启 禁止权限监控 即可
报错
NoClassDefFoundError
Lcom/google/gson/GsonBuilder
?答:需按照 Usage 所写,将项目下所有 jar
monkey.jar fastbot-thirdpart.jar framework.jar
push 到/sdcard
中,并且注意按照文档中运行命令 classpath 包含fastbot-thirdpart.jar
报错 Error:
Could not load library
dlopen failed! libfastbot_native.so
答:需按照 Usage 所写,将项目下所有libs文件push到手机中
adb push libs/* /data/local/tmp/
稳定性测试后,app进入新页面返回都会出现启动app,如何处理?
答:触发了不保留活动时,每销毁一个activitity都会重启app,开关-开发者选项的不保留活动
adb shell settings put global always_finish_activities 0 1代表开启,0代表关闭
有用的adb命令
- 获取app包名
# 获取安装的非系统包名---常用
adb shell pm list packages -3
# 获取所有包名
adb shell dumpsys package | findstr "package"
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。