24、Monkey 测试:adb shell monkey(压力测试基础)、Monkey 参数详解(-p、-v、--throttle)、实战:自动化稳定性测试。
各位同学,今天我们来聊聊 Android 稳定性测试里一个非常经典的工具——Monkey。说实话,我入行那会儿,Monkey 几乎是每个测试同学和开发同学的必修课。它简单、粗暴,但确实能发现不少隐藏的崩溃和 ANR 问题。
Monkey 是什么?说白了,它就是一个跑在设备上的「猴子程序」。这只猴子会随机地在你的 App 界面上乱点、乱滑、乱按。你想想看,如果连猴子都搞不崩溃你的 App,那说明你的 App 稳定性还不错。当然,这只是个比喻,实际测试中我们需要更精细地控制这只「猴子」的行为。
Monkey 测试基础:adb shell monkey
Monkey 是 Android 系统自带的一个命令行工具,通过 adb 来调用。最基本的用法就是:
adb shell monkey [参数] [事件数量]
比如,我想让猴子在我的手机上随机触发 500 个事件:
adb shell monkey 500
嗯,这里要注意。如果不加任何参数,Monkey 会针对整个系统进行操作。这意味着它可能会点开设置、拨号、短信,甚至卸载你的 App。我在项目中就遇到过,测试同学跑了一晚上 Monkey,第二天发现手机上的微信被卸载了……所以,我们通常需要限制 Monkey 的作用范围。
Monkey 参数详解:-p、-v、--throttle
Monkey 的参数非常多,但最核心、最常用的就是这三个:-p、-v 和 --throttle。掌握了它们,你就能应对 90% 的日常测试场景。
-p:指定测试包名
-p 参数用来指定 Monkey 只针对某一个或几个特定的 App 进行操作。格式是:
adb shell monkey -p com.example.myapp 500
如果你想让 Monkey 在多个 App 之间随机切换,可以写多个 -p:
adb shell monkey -p com.example.app1 -p com.example.app2 500
我个人习惯,在正式跑 Monkey 之前,一定会先用 adb shell pm list packages | grep <关键词> 确认一下包名是否正确。包名写错了,Monkey 就会跑在整个系统上,后果你懂的。
-v:控制日志详细程度
-v 参数用来控制 Monkey 输出的日志详细程度。每个 -v 增加一级详细度:
| 参数 | 日志级别 | 输出内容 |
|---|---|---|
-v |
Level 0 | 启动信息、测试结果、最终统计 |
-v -v |
Level 1 | 包含每个事件的信息 |
-v -v -v |
Level 2 | 最详细,包含所有事件和调试信息 |
我建议,日常调试用 -v -v 就够了。如果发现崩溃,再开 -v -v -v 去抓详细日志。日志太多反而不好分析。
--throttle:事件间隔
--throttle 参数用来设置每个事件之间的延迟时间,单位是毫秒。如果不加这个参数,Monkey 会以最快的速度疯狂点击,这其实不太符合真实用户的操作习惯。
adb shell monkey -p com.example.myapp --throttle 300 500
上面的命令表示:每两个事件之间间隔 300 毫秒,总共执行 500 个事件。我曾经在测试一个视频播放 App 时,没有加 --throttle,结果 Monkey 在 2 秒内触发了上百次播放/暂停操作,直接把 MediaPlayer 搞崩了。加了 500ms 的间隔后,问题反而没有复现。所以,--throttle 不仅是为了模拟真实操作,也是为了让测试更「公平」。
实战:自动化稳定性测试
好了,理论知识讲完了。我们直接上手一个完整的实战案例。假设我们要测试一个名为 com.example.myapp 的 App,要求跑 10000 个事件,事件间隔 300ms,日志级别为详细,并且把日志保存到电脑上。
完整的命令如下:
adb shell monkey -p com.example.myapp -v -v --throttle 300 10000 2>&1 | tee monkey_test.log
解释一下:
2>&1:将错误输出也重定向到标准输出,这样崩溃信息也能被捕获。tee monkey_test.log:同时将日志输出到屏幕和文件。
跑完之后,我们需要分析日志。重点关注两个地方:
- 崩溃(CRASH):日志中搜索
CRASH关键字,找到崩溃的堆栈信息。 - ANR:日志中搜索
ANR关键字,找到无响应的信息。
我曾经在一次回归测试中,用 Monkey 跑了一个通宵。第二天一看日志,发现了一个只在特定页面、特定操作顺序下才会触发的空指针异常。这个 Bug 如果靠手工测试,可能一个月都发现不了。这就是 Monkey 的价值所在。
核心要点:
- Monkey 是随机测试,不能保证覆盖所有场景,但能发现「意想不到」的 Bug。
- 一定要加
-p限制包名,否则后果自负。 --throttle建议设置 300-500ms,更接近真实用户操作。- 日志分析是重点,学会用
grep快速定位崩溃和 ANR。
小技巧: 如果你想让 Monkey 更「智能」一点,可以结合 --pct-* 系列参数来调整各种事件的比例。比如 --pct-touch 50 表示触摸事件占 50%。这样可以让测试更聚焦于用户最常用的操作。
避坑指南: 我曾经在跑 Monkey 时,忘记关掉手机的「自动旋转」功能。结果 Monkey 在横竖屏切换时,触发了 Activity 重建,导致一些静态变量被重置,出现了诡异的 NullPointerException。所以,跑 Monkey 之前,建议先把手机设置为「竖屏锁定」。
知识体系图:Monkey 测试核心逻辑
下面这张图帮你梳理了本章的核心知识点,从基础命令到参数详解,再到实战流程,一目了然。
好了,Monkey 测试的基础和实战就讲到这里。记住,Monkey 不是万能的,但它绝对是稳定性测试工具箱里的一把「瑞士军刀」。多用、多分析,你就能慢慢摸透它的脾气。
公众号:蓝海资料掘金营,微信deep3321