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:同时将日志输出到屏幕和文件。

跑完之后,我们需要分析日志。重点关注两个地方:

  1. 崩溃(CRASH):日志中搜索 CRASH 关键字,找到崩溃的堆栈信息。
  2. 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 测试知识体系 adb shell monkey 基础用法 adb shell monkey 500 核心参数详解 -p 指定测试包名 -v 控制日志详细程度 --throttle 事件间隔(毫秒) 实战流程 ① 确认包名 ② 执行命令并保存日志 ③ 分析日志(CRASH/ANR) 目标:发现随机操作下的稳定性问题

好了,Monkey 测试的基础和实战就讲到这里。记住,Monkey 不是万能的,但它绝对是稳定性测试工具箱里的一把「瑞士军刀」。多用、多分析,你就能慢慢摸透它的脾气。


公众号:蓝海资料掘金营,微信deep3321