作为开发者或测试工程师,我们都曾遇到过这样的场景:应用在常规测试中表现完美,功能逻辑无懈可击,但一上线,总有用户能用一些“天马行空”的操作方式,让App意外崩溃(Crash)或无响应(ANR)。这些难以预测的操作,就像一只猴子在屏幕前乱点一通。
那么,有没有一种方法,能让我们在发布前就模拟这种“猴子的行为”,提前发现潜在的稳定性问题呢?
答案就是——Monkey 测试。
什么是 Monkey 测试?
Monkey 测试,又称“猴子测试”,是一种随机化、自动化的软件测试方法。
它的核心思想非常形象:想象一下,把你的手机交给一只顽皮的猴子,它会毫无逻辑地在屏幕上乱点、乱滑、输入随机字符、旋转屏幕、切换网络……做一切可能的操作。Monkey 测试就是用程序来模拟这只“猴子”,通过向App发送大量的伪随机事件流,来测试应用的健壮性(Robustness)和稳定性(Stability)。
它的主要目标不是验证业务逻辑是否正确(比如“支付金额计算是否准确”),而是要回答一个更基本的问题:“在经受了长时间的、混乱的、随机的操作后,我们的App会不会崩溃或卡死?”
Monkey 测试的实战演练 (以 Android 为例)
在 Android 平台,官方已经为我们内置了强大的 Monkey 测试工具。我们只需要通过 Android 调试桥(ADB)就能轻松调用它。
准备工作
安装 Android SDK:确保你的电脑上配置好了 Android 开发环境,
adb命令可以正常使用。连接设备:通过 USB 连接一台安卓手机(并开启“开发者选项”和“USB调试”),或者启动一个安卓模拟器。
基础命令
最简单的 Monkey 命令只需要两个参数:包名和事件数量。
adb shell monkey -p your.package.name 1000
adb shell monkey: 调用 Monkey 工具。-p your.package.name:-p用来指定目标应用的包名。你需要把your.package.name换成你想要测试的应用的真实包名(例如com.tencent.mm是微信的包名)。1000: 你想让“猴子”执行的随机事件总数。
当你在命令行敲下回车,你会看到你的手机屏幕开始自动地、快速地执行各种点击、滑动等操作,就像有一个无形的手在操控一样。
更聪明的“猴子”:常用参数详解
仅仅随机乱点是不够的,我们可以通过添加参数,让这只“猴子”变得更“聪明”,更符合我们的测试需求。
控制事件间隔:
--throttle <毫秒数>让每个操作之间停顿一下,方便我们肉眼观察。例如--throttle 500表示每个事件后暂停500毫秒。adb shell monkey -p your.package.name --throttle 500 1000记录详细日志:
-v -v -v-v参数可以增加日志的详细程度,最多可以用三个-v,级别越高,日志就越详细。这对于分析问题至关重要。忽略崩溃和异常:
--ignore-crashes和--ignore-anrs默认情况下,App一旦崩溃,Monkey 测试就会停止。使用这个参数可以让 Monkey 在应用崩溃后继续测试,以便一次性发现更多问题。控制事件类型百分比:
--pct-touch <百分比>你可以精确控制不同事件的占比。例如,--pct-touch 50表示所有事件中,触摸事件占50%。其他还有--pct-motion(滑动)、--pct-trackball(轨迹球)、--pct-syskeys(系统按键)等。最重要的参数:种子(Seed)
--seed <种子值>这是 Monkey 测试的精髓所在!Monkey 的事件流是“伪随机”的,它由一个“种子值”决定。只要种子值相同,每次执行 Monkey 测试产生的事件序列就完全一样。这意味着什么?当你通过一次 Monkey 测试发现了一个 Bug,你只需要记下这次测试的 seed 值,开发人员就能用相同的命令和 seed 值,100%复现这次导致崩溃的随机操作序列!
# 比如这次测试发现了崩溃 adb shell monkey -p your.package.name --seed 12345 -v 5000 # 开发者可以用完全相同的命令来复现问题 adb shell monkey -p your.package.name --seed 12345 -v 5000
### 如何生成和保存日志文件?
默认情况下,Monkey 测试的所有输出信息(包括事件日志、错误堆栈)都会直接打印在你的命令行窗口中。当测试结束后,这些信息就会丢失。为了方便地分析和归档,我们必须将这些日志保存到一个文件中。
这非常简单,我们只需要使用操作系统的 **“重定向”** 功能即可。
* `>`: 将命令的输出结果保存到指定文件中(会覆盖同名文件)。
* `>>`: 将输出结果追加到指定文件的末尾(不会覆盖)。
**生成日志文件的命令示例:**
```bash
adb shell monkey -p your.package.name -v -v -v --throttle 300 10000 > monkey_log.txt
这个命令会:
对
your.package.name应用执行 10000 次随机事件。使用最高级别的日志详情 (
-v -v -v)。将所有输出的日志信息,完整地保存到你当前命令行路径下的
monkey_log.txt文件中。
最佳实践: 建议在文件名中包含日期或版本信息,方便追溯。同时,将标准输出和错误输出都重定向,可以使用 &> (在某些系统中是 2>&1)。
# 将所有日志(包括错误)都输出到文件中
adb shell monkey -p your.package.name -v -v 5000 &> monkey_log_20251021.txt
如何分析测试结果?
Monkey 测试运行结束后,你需要打开生成的日志文件,关注其中的几个关键词:
// CRASH::最重要!这明确表示你的应用崩溃了。日志会清晰地打印出导致崩溃的进程和具体的异常堆栈信息。// NOT RESPONDING::表示应用出现了 ANR (Application Not Responding),即长时间无响应。// Monkey finished: 如果看到这个,并且没有发现 Crash 或 ANR,恭喜你,你的App成功经受住了这次“猴子”的考验。
你需要做的就是把包含 Crash 或 ANR 信息的日志文件,连同那次测试的 seed 值,一起提交给开发人员。
Monkey 测试的优缺点
优点
成本低,效率高:无需编写任何脚本,一条命令就能进行长时间的自动化压力测试。
发现边界问题:能有效地发现因复杂操作序列、快速操作、系统资源紧张等导致的稳定性问题,这些问题很难通过常规手动测试发现。
简单易用:上手门槛极低,是每个测试和开发人员都应掌握的基础技能。
缺点
无法测试业务逻辑:Monkey 是“盲目的”,它不知道“加入购物车”的下一步应该是“去结算”。
问题复现依赖日志和Seed:如果没有记录好 seed 值,复现一个随机的 Crash 将会非常困难。
无法替代常规测试:它只是质量保障体系中的一个环节,不能替代功能测试、UI测试等。
结论
Monkey 测试是一种简单、粗暴但极其有效的稳定性测试手段。它就像是为你的App请来了一位最苛刻、最不按常理出牌的“首席体验官”。
将 Monkey 测试集成到你的日常构建流程或 CI/CD 管道中,作为每次发布前的自动化稳定性扫描,可以极大地提升应用的健壮性,减少线上那些“莫名其妙”的崩溃,为用户提供更流畅、更可靠的体验。