Android 自动化一般使用 uiautomator 或者 monkey 等工具模拟用户操作,uiautomator 可以定制自已的 case,monkey 可以像小盆友一样乱点
稳定性测试一般需要长时间的运行,定制 case 的方法并不能很好的解决稳定性问题,因为总有 case 考虑不到的情况,当 case 过多,若界面改版发生变化,case 维护成本也是很高的,有时测试任务排期紧,APP 提测后要尽快上线,可能根本没有时间修改 case
随机 + 主要功能定制 case 结合是比较好的方式,既能保证覆盖率,也能保证随机性,这也是我们当前的方案
有时某个模块出现问题,若不能知道复现路径,又想验证开发的 change 是否修复了这个问题,就比较麻烦了,不同的应用需要根据自身 APP 定制模块测试策略,通用性不强
举一个最近的测试例子,有一个直播插件需要集成到我们的应用中,模块入口就像微信中的三方服务一样(像某东,某团,某多多),要先进入一个界面,之后向下滑动才能看到入口,然后只想测试这个模块中的功能,尴尬啊,闹心啊,咋办啊
稳住,别慌,不要乱
凭借本猫的第六感,之前就预感会有这样的需求发生在我的身上,于是就在今年双 12 的时候开始了这个工具的开发(双 12 狠心买了个移动硬盘),由于小米 Mix 手机很酷酷,因此将其以 Mix 命名,此工具是以 android monkey 为基础,二次开发
通用,monkey 是 google 提供的测试方案,各厂商的设备都会兼容
无需签名或 root 设备,由于是和源码一同编译后生成的文件,所以可以做很多普通应用无法做的事情
先看一下如下工具的对比,可以找到我们需要完善和优化的地方
长时间稳定性测试 | monkey | uiautomator2 | mixmonkey |
---|---|---|---|
实时异常检测 | 支持 | 不支持(需要系统签名) | 支持 |
指定测试界面(不包括定制 case) | 不支持 | 不支持 | 支持 |
低内存设备后台优化杀掉测试进程 | 不会 | 可能会(需要加入 ROM 白名单) | 不会 |
测试覆盖率 | 随机 | 随机(依赖 case 数量) | 高 |
安静的测试 | 不支持 | 不支持 | 支持 |
指定 case(不包括-f) | 不支持 | 支持 | 不支持 |
通过上面个表格,可以看出,在定制 case 的前提下,uiautomator2 是比较好的工具,但是要做需要权限的事情,uiautomator2 就很依赖系统签名,通用性不够好,uiautomator1 可以考虑一下 :)
基于当前 monkey 和 uiautomator 的一些问题,将 monkey 做了修改,现已实现的功能如下
1.通用性,无需 root,不依赖签名
2.兼容性,基于 AOSP android-6.0.1_r1 monkey,一个 jar 包兼容 android5-9,(--mix)
3.实时异常检测,保存异常日志到/sdcard/mixmonkey 下,(--savelog)
4.优化了 Touch 事件,获取界面控件操作,点击更加准确
5.优化了 Motion 事件,实现真正意义上的上下左右滑动,当前 Motion 事件,有小概率为原生 Motion,其他是上下左右滑动
6.优化了 Back 事件概率低问题,加入 Back 事件百分比,(--pct-syskeys-back)
7.模块测试,activity 白名单,支持 Deeplink,文件可以使用 # 注释,读取文件时将忽略 # 开头的行,(--activity-whitelist-file)
8.安静测试,加入 Mute 事件百分比,(--pct-syskeys-mute)
9.防止跳出,每 10 个事件循环会检测一次当前界面是否在测试包中,若不在,则拉起被测应用(1.0.3 版本添加)
10.将 KEYCODE_MENU 添加到 syskeys 中
事件 | 百分比 | 参数 | 备注 |
---|---|---|---|
ANYTHING | 0 | --pct-anyevent | |
APPSWITCH | 3 | --pct-appswitch | |
BACK | 15 | --pct-syskeys-back | |
FLIP | 0 | --pct-flip | |
MAJORNAV | 0 | --pct-majornav | |
MOTION | 18 | --pct-motion | 加--mix 参数后,上下左右滑动,仅小概率原生 Motion |
MUTE | 3 | --pct-syskeys-mute | |
NAV | 0 | --pct-nav | |
PERMISSION | 0 | --pct-permission | |
PINCHZOOM | 3 | --pct-pinchzoom | |
ROTATION | 5 | --pct-rotation | |
SYSOPS | 3 | --pct-syskeys | 加--mix 参数后,只有 KEYCODE_HOME,KEYCODE_MENU |
TOUCH | 50 | --pct-touch | |
TRACKBALL | 0 | --pct-trackball |
adb shell CLASSPATH=/sdcard/mixmonkey.jar exec app_process /system/bin com.android.commands.monkey.Monkey -h
usage: monkey [-p ALLOWED_PACKAGE [-p ALLOWED_PACKAGE] ...]
[-c MAIN_CATEGORY [-c MAIN_CATEGORY] ...]
[--ignore-crashes] [--ignore-timeouts]
[--ignore-security-exceptions]
[--monitor-native-crashes] [--ignore-native-crashes]
[--kill-process-after-error] [--hprof]
[--pct-touch PERCENT] [--pct-motion PERCENT]
[--pct-trackball PERCENT] [--pct-syskeys PERCENT]
[--pct-nav PERCENT] [--pct-majornav PERCENT]
[--pct-appswitch PERCENT] [--pct-flip PERCENT]
[--pct-anyevent PERCENT] [--pct-pinchzoom PERCENT]
[--pct-permission PERCENT]
[--pkg-blacklist-file PACKAGE_BLACKLIST_FILE]
[--pkg-whitelist-file PACKAGE_WHITELIST_FILE]
[--wait-dbg] [--dbg-no-events]
[--setup scriptfile] [-f scriptfile [-f scriptfile] ...]
[--port port]
[-s SEED] [-v [-v] ...]
[--throttle MILLISEC] [--randomize-throttle]
[--profile-wait MILLISEC]
[--device-sleep-time MILLISEC]
[--randomize-script]
[--script-log]
[--bugreport]
[--periodic-bugreport]
[--permission-target-system]
mixmonkey [--mix] 存在此参数则执行mixmonkey,否则执行原生monkey
mixmonkey [--savelog] 存在此参数则发生crash或anr时将日志保存在/sdcard/mixmonkey下面,包括logcat.log logstack.log traces.txt screenshot.png
mixmonkey [--running-minutes MINUTES] 运行时间(单位分钟),若此参数和COUNT共存,则以最先结束的为准
mixmonkey [--activity-whitelist-file ACTIVITY_WHITELIST_FILE] 存在此参数则只在配置的activity中执行测试,请注意,(1)若应用崩溃,进程退出,则无法重新进入被测模块继续测试。(2)whitelist文件首个activity必须是模块的入口activity,不支持入口在Fragment中,与其他Fragment共用一个Activtiy的情景,如TAB页,此时需要将入口设置成进入模块后的activity
mixmonkey [--pct-syskeys-back PERCENT] Back事件百分比
mixmonkey [--pct-syskeys-mute PERCENT] Mute事件百分比
mixmonkey [--version] 版本信息
COUNT
将 mixmonkey.jar push 到/sdcard/下面
启动命令
adb shell CLASSPATH=/sdcard/mixmonkey.jar exec app_process /system/bin com.android.commands.monkey.Monkey -p xxx --mix --savelog --activity-whitelist-file /sdcard/whitelist --running-minutes 60 --ignore-crashes --ignore-timeouts --ignore-security-exceptions --ignore-native-crashes -vv --throttle 300 10000
下载地址 mixmonkey.jar
社区 zhangzhao_lenovo 大神之前曾做过fastmonkey的工具,之前使用过,感觉非常不错,但是由于不开源,有很多想适配当前业务的功能无法添加,于是决定发粪涂墙!从 0 到 1,从无到有,一边工作,一边改猴,12 月的最后两周真是非常不易
工具还在开发阶段,先提供一个稳定初版,欢迎大家提出宝贵建议,感激不尽!
说了题外话,我和阿联打了个赌,如果MixMonkey超过 50 个星他就请我吃一顿鱼,欢迎捧场:)
收工~~
本文为作者原创,如需转载,请注明出处,感谢