美文网首页
Fastbot-Android遍历测试

Fastbot-Android遍历测试

作者: 崔某 | 来源:发表于2021-07-01 17:49 被阅读0次

    前言

    此博客参考字节跳动技术团队分享,在此由衷感谢!
    Fastbot算法原理介绍:https://mp.weixin.qq.com/s/3t4H2bfDjei4vXkj_Cz2pg

    1、介绍

    基于model-based testing 结合机器学习、强化学习的APP 稳定性测试工具,优势如下:

    • Android多OS兼容
      同时兼容Android5-11,兼容国内各⼚商定制化的Android系统及原⽣Android系统
    • 事件快速注入
      继承原生Monkey的优势,快速点击,每秒最多可发送12个事件
    • 专家系统
      不同业务线支持不同的个性化需求,业务深度定制化
    • 智能化测试
      基于model-based 边遍历边建模,利用强化学习等算法做高收益决策
    • 跨平台
      支持非标准化控件,YOLOv3、ocr、cv分割等UI图像识别能力

    2、环境搭建

    2.1、源码下载
    GitHub地址:https://github.com/bytedance/Fastbot_Android
    git clone下来目录如下:

    image.png
    2.2、环境预备
    • 支持 Android 5,6,7,8,9,10,11真机及模拟器
    • 将 framework.jar , monkeyq.jar push 到手机上某个目录中,建议 /sdcard
    adb push framework.jar /sdcard
    adb push monkeyq.jar /sdcard
    

    2.3、shell运行

    image.png
    注:若断开USB先执行shell命令,可在命令后,加上&符号
    adb -s 设备号 shell CLASSPATH=/sdcard/monkeyq.jar:/sdcard/framework.jar exec app_process /system/bin com.android.commands.monkey.Monkey -p 包名 --agent robot --running-minutes 遍历时长 --throttle 事件频率 -v -v
    

    参数说明:

    -s 设备号 #多个设备需要指定设备号,单独设备无需此-s参数
    -p 包名 # 遍历app的包名,-p+包名
    --agent robot # 遍历模式,无需更改
    --running-minutes 遍历时长(分钟) # 遍历时间:--running-minutes 时间
    --throttle 事件频率 # 遍历事件频率,建议为500-800
    (可选参数)
    --bugreport #崩溃时保存bug report log
    --output-directory /sdcard/xxx #log\crash 另存目录
    

    结果说明:

    • 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
      如下为Google电话为例(acitity覆盖率为4.76%):
      image.png
      注意事项:
      totalActivities:通过framework接口 PackageManager.getPackageInfo 获取,这包含app中所有的Activity,其中也包含了很多废弃、不可用、不可达等Activity。

    3、专家系统

    3.1、ADBKeyBoard介绍:

    "adb shell input text hello"可以通过adb 输入英文的文本,由于不支持unicode编码,所以无法输入中文!ADBKeyBoard是一个虚拟键盘,它接收来自系统broadcast的命令,可以使用ADB输入文本内容,以下是adb 的input事件发生文本。但是,不能使用此命令发送Unicode字符。
    GitHub地址:https://github.com/senzhk/ADBKeyBoard
    git clone下来目录如下:

    image.png
    通过adb install [ADBKeyboard.apk 电脑路径] 安装
    然后在手机端设置ADBKeyboard为默认输入法,cmd控制台输入adb测试效果:
    adb shell am broadcast -a ADB_INPUT_TEXT --es msg 测试
    
    image.png

    手机端显示如下:


    BV6600Pro_20210701144647.png

    3.2、自定义输入法:

    ADBKeyBoard在输入栏自动输入内容,屏蔽UI输入法
    适用需求:遇到搜索栏乱输入,想要输入指定字符

    • 下载ADBKeyBoard,并在手机端中设置为默认输入法,生效后如上图
    • 随机输入字符串
      配置max.config 中 max.randomPickFromStringList = false
      1.在pc端新建max.config文件(文件名称不可更改)
      2.输入 max.randomPickFromStringList = false
      3.通过adb push max.config /sdcard命令将max.config文件push到手机端
    • 从文件中随机读取字符串输入
      配置max.config 中 max.randomPickFromStringList = true
      1.在pc端新建max.strings文件(文件名称不可更改)
      2.输入想要输入的字符串,字符串结束要换行
      3.通过adb push max.strings /sdcard命令将max.strings文件push到手机端

    3.3、自定义事件序列

    手动配置Activity的路径(UI自动化用例)
    适用需求:场景覆盖不全,通过人工配置到达Fastbot遍历不到的场景
    1.在pc端新建 max.xpath.actions文件(文件名称不可更改)
    2.编写事件序列配置(case):

    # 谷歌电话示例
    [
    {
        "prob":1,
        "activity":"com.google.android.dialer.extensions.GoogleDialtactsActivity",
        "times":1,
        "actions":[
            {
                "xpath":"//*[@resource-id='com.google.android.dialer:id/dialpad_fab']",
                "action":"CLICK",
                "throttle":2000
            },
            {
                "xpath":"//*[@resource-id='com.google.android.dialer:id/search_edit_text']",
                "action":"CLICK",
                "text":"搜索联系人和地点",
                "clearTest":false,
                "throttle":2000
            }
        ]
    }
    ]
    

    参数介绍:

    prob:发生概率,"prob":1,代表发⽣概率为100%
    activity:所属场景(当前页面所属的Activity)
    times:重复次数,默认为1即可
    actions:具体步骤的执行类型
    throttle:action间隔事件(ms)
    

    action参数介绍(必须大写):

    CLICK:点击,如果想要输入内容,则在action下补充text,如果有text属性则执行文本输入
    LONG_CLICK:长按
    BACK:返回
    SCROLL_TOP_DOWN:从上向下滚动
    SCROLL_BOTTOM_UP:从下向上滑动
    SCROLL_LEFT_RIGHT:从左向右滑动
    SCROLL_RIGHT_LEFT:从右向左滑动
    

    注:存在页面切换的情况,activity会跳转,则需要对actions进行拆分(同一个activity不需要跳转),从prob开始写下一个activity

    3.编写好文件后,在json.cn中检查无误后,通过adb push 路径+max.xpath.actions /sdcard推送到手机端中
    小技巧:adb shell dumpsys window | findstr mCurrentFocus 命令可查看当前应用包名及Activity名

    3.4、场景细粒度控制

    手动配置黑、白名单配置
    适用需求:单独覆盖⼏个场景或屏蔽一些不必要场景

    Activity白名单配置(只覆盖白名单内的activity):

    1. 在PC端新建awl.strings文件(名称固定为:awl.strings)
    2. 在文件中写入Activity的名称,以换行符分隔


      image.png
    3. 通过adb push awl.strings /sdcard将awl.strings文件push到手机端的sdcard目录下
    4. 运行命令时添加以下参数:--act-whitelist-file /sdcard/awl.strings
      image.png

    Activity黑名单配置(黑名单内的activity不覆盖):

    1. 在PC端新建abl.strings文件(名称固定为:abl.strings)
    2. 在文件中输入Activity的名称,同白名单方法一致
    3. 通过adb push abl.strings /sdcard将awl.strings文件push到手机端的sdcard目录下
    4. 运行命令时添加以下参数:--act-blacklist-file /sdcard/abl.strings
      image.png

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

    3.5、屏蔽控件或区域

    手动配置需要屏蔽的控件或区域
    适用需求:测试过程中“半路”中途退出登录,屏蔽退出登录按钮

    屏蔽控件或区域:

    1. 在PC端新建max.widget.black文件(名称固定为:max.widget.black)
    2. 文件内容配置格式如下:
      配置activity:当activity与当前activity一致时执行如下匹配
      屏蔽控件或区域共有三种方式:
      配置bounds:屏蔽某个区域,在该区域内的控件或坐标不会被点击。
      配置xpath:查找匹配的控件,屏蔽点击该控件。
      配置xpath+bounds:查找匹配的控件,当控件存在时屏蔽指定的区域。


      image.png
    3. 通过adb push max.widget.black /sdcard推送到手机端中

    树剪枝屏蔽:

    1. 在PC端新建max.tree.pruning文件(名称固定为:max.tree.pruning)
    2. 文件内容配置格式如下:
      配置activity:当activity与当前activity一致时执行如下匹配
      剪枝方式:
      配置xpath:查找匹配的控件,改变控件属性,从而使控件屏蔽


      image.png
    3. 通过adb push max.tree.pruning /sdcard推送到手机端中
      注:剪枝屏蔽效率更高,但无法作用户于fuzzaction,通常控件区域屏蔽需同时配置黑控件及树剪枝

    3.6、反混淆

    手动配置反混淆文件,针对每个包的混淆xpath做处理
    适用需求:对黑、白名单、屏蔽控件和自定义事件中的xpath做反混淆转换(个人理解:xpath值一样时做一定的转换)

    1. 配置混淆映射文件并push到手机端sdcard中
      adb push resguard_mapping_NewsArticle_beta_version_v7.2.x_?????.txt /sdcard
    2. 配置反混淆文件,以自定义事件为例,在max.xpath.actions中配置混淆前的id
    3. 运行命令时添加以下参数:--resMapping-file/sdcard/混淆映射文件


      image.png

    3.7、高速截图及打印xml结构

    保存测试过程中的截图和打印xml结构
    适用需求:观察测试过程中的截图

    1. 高速截图保存条件为:
      在PC端新建max.config文件,增加以下属性
      max.takeScreenshot = true
      max.takeScreenshotForEveryStep = true
      max.saveGUITreeToXmlEveryStep =true
    2. 通过adb push max.config /sdcard推送到手机端中
    3. 目录默认保存为手机端sdcard中,如需改变保存位置,在执行命令末尾添加:--output-directory 指定路径
      image.png
      注:--throttle参数要>200才会截图

    3.8、权限自动授予

    app的权限弹窗处理,默认启动app前会自动授予app所需的所有权限,但如果想测试app运⾏过程中的动态权限弹窗
    在max.config配置:
    max.grantAllPermission = false
    此时Fastbot启动后不会⾃动授予各种权限;
    shell中增加:

    -p com.android.packageinstaller
    -p com.android.permissioncontroller
    -p com.lbe.security.miui (miui android 10)
    -p com.samsung.android.permissioncontroller (samsung android 10)
    

    增加其一弹窗相关package,可在权限弹窗时关闭弹窗;

    相关文章

      网友评论

          本文标题:Fastbot-Android遍历测试

          本文链接:https://www.haomeiwen.com/subject/etpjultx.html