介绍

基于 Model-based Testing 结合机器学习、强化学习的APP 稳定性测试工具

原文:https://github.com/bytedance/Fastbot_Android/blob/main/handbook-cn.md

优势

  1. Android 多 os 兼容:
    同时兼容 Android 5~14,兼容国内各厂商定制化的 Android 系统及原生 Android 系统;
  2. 事件快速注入:
    继承原生 Monkey 的优势,快速点击,每秒最高可发送 12 个事件;
  3. 专家系统:
    不同业务线支持不同的个性化需求,业务深度定制化;
  4. 智能化测试:
    基于 Model-based 边遍历边建模,利用强化学习等算法做高收益决策;

环境预备

  • 支持 Android 5,6,7,8,9,10,11,12,13,14 真机及模拟器
  • framework.jar fastbot-thirdpart.jar monkeyq.jar push 到手机上某个目录中,建议/sdcard,push libs/* /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

参数说明

  1. -s 设备号 多个设备需要指定设备号,单独设备无需此-s参数
  2. -p 包名 遍历app的包名,-p+包名
  3. --agent reuseq 遍历模式,无需更改
  4. --running-minutes 遍历时长(分钟) # 遍历时间:--running-minutes 时间
  5. --throttle 事件频率 遍历事件频率,建议为500-800
  6. 可选参数

    • --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

结果说明

  1. Crash、ANR 捕获

    • 捕获到Java Crash、ANR、Nativie Crash会以追加方式写入/sdcard/crash-dump.log文件
    • 捕获的Anr 同时也会写入 /sdcard/oom-traces.log 文件
  2. Activity覆盖率统计

    • 正常跑完Fastbot会在当前shell中打印totalActivity(总activity列表),ExploredActivity(遍历到的activity列表)以及本次遍历的总覆盖率
    • 总覆盖率计算公式: coverage = testedActivity / totalActivities * 100

自定义配置

totalActivities:通过framework接口 PackageManager.getPackageInfo 获取,这包含app中所有的Activity,其中也包含了很多废弃、不可见、不可达等Activity

常用的自定义事件(待补充...)

场景细粒度控制

手动配置黑、白名单配置

适用需求 单独覆盖几个场景或屏蔽一些不必要场景

  1. 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
  • awl.strings 文件push到手机端的sdcard目录下, 目录必须为sdcard

       adb 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
  1. Activity黑名单配置(黑名单内的activity不覆盖)

    • 在PC端新建 abl.strings 文件(名称固定为:abl.strings)
    • 在文件中输入Activity的名称,同白名单方法一致
    • abl.strings 文件push到手机端的sdcard目录下, 目录必须为sdcard

      adb 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

注意: 白名单和黑名单不能同时设置,按照非白即黑的原则,即设置了白名单则白名单外的都为黑名单。通过hook 可以监控activity 启动和切换,如果启动的是黑名单中的activity,就拒绝启动该activity,从ui上看就是点了跳转没效果

屏蔽控件或区域

手动配置需要屏蔽的控件或区域

适用需求: 测试过程中“半路”中途退出登录,屏蔽退出登录按钮

  1. 黑控件、黑区域

    • 在PC端新建 max.widget.black 文件(名称固定为:max.widget.black),文件内容配置格式如下:
    [
        {
            "activity": "com.XXX.XXX.main.activity.XXXMainActivity",
            "xpath": "//*[@resource-id='com.XXX.customer:id/float_icon_id']"
        }
    ]
  • 匹配条件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 
  1. 树剪枝屏蔽

    • 在PC端新建 max.tree.pruning 文件(名称固定为:max.tree.pruning),文件内容配置格式如下:
    • 匹配条件activity:当activity与currentactivity一致时执行如下匹配
    • 剪枝方式:

      • 配置xpath:查找匹配的控件,改变控件属性,从而使控件屏蔽
  

 ```
 max.tree.pruning
 ```

  

 文件push到手机端的sdcard目录下, /sdcard # 目录必须为sdcard

 ```
 adb push max.tree.pruning /sdcard 
 ```

常见问题(待补充...)

  1. 本地测试时,手机的顶部状态栏找不到了,怎么恢复呢?

    答: adb shell wm overscan reset ps: 为了防止测试时点击到设置,影响测试效果,做的特殊设置

  2. 小米手机运行 Fastbot 报错?Injecting input events requires the caller (or the source of the instrumentation, if any) to have the INJECT_EVENTS permission

    答:开启 “开发者选项” -> "USB调试(安全设置)允许通过usb调试修改权限或模拟点击"

  3. 运行Fastbot时无任何log,启动后就退出?

    答:需检查/sdcard/是否存在 monkey.jar fastbot-thirdpart.jar framework.jar。`部分机型发现adb push过去monkey.jar 自动被更名成monkey. 导致无法运行。

  4. vivo7.1运行Fastbot报错?

    答:关闭锁屏和开启usb模拟点击即可。

  5. oppo运行Fastbot 1.0模式报错?

    答:oppo存在权限监控,需要在开发者-> 开启 禁止权限监控 即可

  6. 报错 NoClassDefFoundError Lcom/google/gson/GsonBuilder?

    答:需按照 Usage 所写,将项目下所有 jar monkey.jar fastbot-thirdpart.jar framework.jar push 到 /sdcard中,并且注意按照文档中运行命令 classpath 包含 fastbot-thirdpart.jar

  7. 报错 Error: Could not load library dlopen failed! libfastbot_native.so

    答:需按照 Usage 所写,将项目下所有libs文件push到手机中 adb push libs/* /data/local/tmp/

  8. 稳定性测试后,app进入新页面返回都会出现启动app,如何处理?

    答:触发了不保留活动时,每销毁一个activitity都会重启app,开关-开发者选项的不保留活动

    adb shell settings put global always_finish_activities 0
    1代表开启,0代表关闭

有用的adb命令

  1. 获取app包名
# 获取安装的非系统包名---常用
adb shell pm list packages -3

# 获取所有包名
adb shell dumpsys package | findstr "package"
文章目录