什么是 Monkey 测试?它能发现哪些类型的问题?
解读
面试官问“Monkey 测试”并不是想听“一只猴子乱点屏幕”的段子,而是考察候选人是否真正在国产 ROM、国内复杂机型、国内用户高频操作场景下做过稳定性验收。国内大厂(华米 OV 及 BAT 系 App)普遍把 Monkey 纳入 nightly 构建,Google Play 在国内不可用,厂商自带的稳定性平台(如华为 APM、OPPO 云测、vivo Crash 平台)都会先跑一轮 Monkey 过滤低级崩溃,再进入深度测试。因此,回答要聚焦三点:
- Monkey 的本质是“随机事件流 + 系统级压力”;
- 在国内机型上能暴露哪些“特色”问题(权限弹窗、厂商杀后台、悬浮球、游戏助手、微信登录弹窗等干扰事件);
- 如何与日志、崩溃平台、ANR 文件、dropbox 结合定位。
知识点
- Monkey 命令框架:adb shell monkey -p <包名> --throttle <毫秒> -s <种子> -v -v --ignore-crashes --ignore-timeouts --ignore-security-exceptions --kill-process-after-error <事件数>
- 事件类型:11 种(触摸、手势、轨迹球、按键、屏幕旋转、键盘开关、导航、系统按键、Activity 启动、屏幕休眠、基本导航),通过 --pct-xxx 调节比例。
- 国内特色干扰:厂商权限弹窗、悬浮球、全面屏手势、三指截屏、游戏助手、深色模式切换、自由窗口、分屏、小窗、气泡通知。
- 可发现问题:
- Java 层崩溃:NullPointerException、IllegalStateException、BadTokenException(国内 ROM 悬浮窗权限拒绝触发)。
- JNI 崩溃:libxxx.so 段错误、SIGBUS、SIGSEGV,常见于国内第三方 SDK(推送、广告、人脸识别)。
- ANR:主线程被锁、Binder 阻塞、I/O 在主线程、广播超时(国内 ROM 对后台拉起限制加剧)。
- 内存泄漏:Activity 被静态引用、Handler 匿名内部类、注册未反注册、国内 SDK 缓存图片未释放。
- 资源泄漏:Cursor、TypedArray、BroadcastReceiver、SensorManager、WakeLock、MediaPlayer。
- 逻辑异常:状态机错乱、Fragment 重叠、后台弹 Activity 被系统拒绝、透明主题与屏幕旋转冲突。
- 并发问题:SharedPreferences 多进程读写、SQLite 多线程写、EventBus 粘性事件重放。
- 日志获取:
- crash 日志:/data/tombstones、/data/anr、logcat | grep DEBUG、dropboxManager。
- ANR 日志:/data/anr/trace_*.txt,结合 BlockCanary 可提前预警。
- 内存快照:hprof 转储,MAT 或 LeakCanary 分析。
- 国内 CI 集成:
- nightly Job:Jenkins + 华为云手机农场 / 阿里 MQC / Testin 云测,跑 50 万事件 ≈ 2 小时。
- 过滤规则:白名单忽略系统弹窗、黑名单屏蔽厂商管家类 Activity。
- 结果收敛:崩溃去重(堆栈 hash)、聚类后自动提 Jira,次日站会高优修复。
答案
Monkey 测试是 Android 官方提供的命令行黑盒压力工具,通过向被测应用注入伪随机用户事件流(触摸、手势、按键、屏幕旋转等),在短周期内模拟“千万级”用户乱点,从而快速暴露稳定性缺陷。
在国内落地时,我们通常在 nightly 构建中触发 50 万事件,命令示例:
adb shell monkey -p com.xxx.app --throttle 300 -s 10086 -v -v --pct-touch 40 --pct-motion 25 --pct-syskeys 5 --pct-appswitch 10 --ignore-crashes --ignore-timeouts --ignore-security-exceptions --monitor-native-crashes --kill-process-after-error 500000
它能发现以下五类问题:
- 崩溃:Java 未捕获异常、JNI 段错误、厂商 ROM 特有 BadTokenException。
- ANR:主线程阻塞、广播超时、后台启动 Activity 被系统拦截导致的输入分发超时。
- 内存与资源泄漏:Activity 无法回收、Cursor 未关闭、WakeLock 未释放。
- 逻辑与并发缺陷:Fragment 重叠、SharedPreferences 多进程读写冲突、EventBus 事件重放。
- 兼容性问题:悬浮窗权限拒绝、分屏+小窗切换、深色模式配置变更、折叠屏旋转。
跑完后,通过 logcat 过滤“FATAL EXCEPTION”与“ANR in”,结合厂商云测平台自动抓取 tombstone 与 trace,堆栈去重后录入缺陷系统,高优修复并回归验证。
拓展思考
- 随机事件无法覆盖业务主路径,如何与“智能 Monkey”结合?
答:国内已有基于控件解析的遍历工具(如阿里 Macaca、腾讯 NewMonkey、字节 FastBot),通过 UIAutomator dump 控件树,优先点击可点击节点,覆盖率可从 30% 提升到 70% 以上。 - 事件比例如何调优?
答:短视频 App 滑动占比高,可将 --pct-motion 调到 50;阅读类 App 按键翻页多,可上调 --pct-nav;游戏需屏蔽 Home 键,加 --pct-syskeys 0 并配合 --pct-appswitch 0。 - 如何验证“修复”有效?
答:使用相同种子(-s)重跑,确保崩溃不再复现;同时把堆栈 hash 加入黑名单,下次 nightly 若再出现同样 hash 则直接失败构建,实现回归零容忍。