一、 Monkey测试概述

1. 什么是Monkey测试?
Monkey是Android自带的一种伪随机压力测试工具。它通过生成随机的用户事件(如触摸、滑动、按键等),模拟用户在高压和随机操作下的行为,主要用于测试App的稳定性和健壮性。

2. 核心优缺点

  • 优点:快速发现崩溃/ANR、无需编写复杂脚本、支持长时间自动化运行。
  • 缺点:缺乏业务针对性(随机操作无法覆盖特定业务流程)、无法模拟复杂的业务逻辑。

二、 测试环境与准备

在开始测试前,需确保以下基础环境就绪:

  1. 安装配置:安装Android SDK并配置好环境变量,确保adb命令可用。
  2. 连接设备:通过USB连接真机或启动模拟器,使用 adb devices 确认设备已连接。
  3. 获取包名:使用 adb shell pm list packages 查询并确认待测App的包名(如 com.tencent.mm)。
  4. 找到当前停留的包名:adb shell dumpsys window | findstr "mCurrentFocus"

三、 核心命令与参数配置

Monkey命令的基本格式为:adb shell monkey [参数] <事件数量>

1. 基础控制参数
参数作用说明示例
-p指定包名(必须,限制测试范围)-p com.example.app
-v日志级别(最多3个,-v -v -v最详细)-v -v -v
--throttle <毫秒>事件延迟(模拟真实用户操作速度)--throttle 1000 (延迟1秒)
--seed <值>随机种子(相同seed可复现相同操作序列)--seed 12345
2. 异常处理参数
参数作用说明
--kill-process-after-error遇到崩溃(Crash)或ANR时立即停止测试。
--ignore-crashes遇到崩溃时忽略并继续测试。
--ignore-timeouts遇到ANR(超时)时忽略并继续测试。

四、 事件类型与比例控制(核心调优)

Monkey允许你精确控制各类事件的触发比例(总和需为100%),以模拟特定的用户行为:

事件类型参数控制描述
触摸事件--pct-touch <百分比>模拟点击、长按等屏幕触摸操作。
手势/滑动--pct-motion <百分比>模拟滑动、拖拽等手势操作。
系统按键--pct-syskeys <百分比>模拟Home、Back、菜单等系统级按键。
导航事件--pct-nav <百分比>模拟方向键等导航操作。
Activity切换--pct-appswitch <百分比>随机启动不同的Activity。
屏幕旋转--pct-rotation <百分比>模拟屏幕横竖屏旋转。

五、 高级用法与日志管理

1. 限制测试范围

  • 限制Activity:使用 --activity-filter <activity-name> 防止Monkey跳转到非目标页面。
  • 多包名测试:可以传入多个 -p 参数同时测试多个应用。

2. 日志级别详解

  • -v:基础日志(每1000个事件统计一次,仅记录崩溃/异常)。
  • -v -v:中等日志(记录每个事件的具体类型)。
  • -v -v -v:最高级别(记录时间戳、App状态变化及底层调试信息,推荐排查问题时使用)。

3. 日志导出
将日志保存到本地文件以便后续分析:

adb shell monkey -p com.example.app -v -v -v 1000 > monkey_log.txt

六、 结果分析与问题定位

测试完成后,通过分析日志文件来判定App的稳定性:

  • 🟢 正常结束:日志末尾出现 Monkey finished,且无严重错误关键字。
  • 🔴 异常定位(重点搜索以下关键字):
    • CRASH / exception:应用发生崩溃(需结合堆栈信息定位代码行)。
    • ANR:应用无响应(通常伴随主线程阻塞的日志)。
    • E/ACRA 或 特定业务相关的 Exception。

七、 实战演练与最佳实践

痛点解决:如何防止Monkey按Home/Back键退出App?

解决方案:将系统按键事件比例设为0,即添加参数 --pct-syskeys 0。

终极实战:1分钟高强度压测命令

需求:测试微信(com.sankuai.meituan),点击50%,滑动50%,防退出,遇崩溃停止,延迟1秒,最高日志级别,输出到当前目录的 log.txt。
(注:1分钟 = 60秒,延迟1秒即执行60次事件)

完美命令:

adb shell monkey -p com.cat.readall --pct-touch 50 --pct-motion 50 --pct-syskeys 0 --throttle 1000 --kill-process-after-error -v -v -v 60 > ./log.txt

进阶:Monkey + Logcat 双管齐下

为了捕获更完整的系统级崩溃信息,可以将Monkey日志与Android系统的Logcat日志同时抓取。

在 Windows 系统下,想在一个黑框里搞定,我们需要请出一个专门的“后台运行”指令:start /b。它的作用就是:把命令藏到后台默默执行,表面上看起来什么都没发生。

你只需要复制下面这一整行命令,粘贴到你的黑框里,按下回车即可:

start /b adb logcat > logcat.txt & adb shell monkey -p com.cat.readall --pct-touch 50 --pct-motion 50 --pct-syskeys 0 --throttle 1000 -v -v -v 100 > log.txt
  • 注意:(linux中的写法)
adb logcat > monkey_log.txt & adb shell monkey -p com.cat.readall -- pct-touch 50 --pct-motion 50 --pct-syskeys 0 --throttle 1000 --kill-process-after-error -v -v -v 100

  • 按下回车后,你的黑框会发生什么?

    1. “摄像机”已隐藏开机:start /b 会把 adb logcat 扔到后台默默录像(存入 logcat.txt),黑框里不会有任何提示。
    2. “演员”立刻上场:紧接着,黑框里会立刻开始显示 Monkey 执行 100 次操作的进度。
    3. 表演结束:大概 100 秒后,Monkey 跑完,黑框里重新出现 D:\...> 的提示符,说明测试结束了。

🎉 搞定!现在你的文件夹里已经同时生成了 log.txt 和 logcat.txt 两个文件。


  • 唯一需要注意的“收尾工作”(必看)

虽然黑框里提示 Monkey 跑完了,但后台的“摄像机”(Logcat)还在傻傻地一直录像。

为了关掉它,当你看到黑框出现 D:\...> 提示符后,请紧接着输入下面这条命令并回车:

taskkill /F /IM adb.exe

(这条命令的意思是:强行结束所有的 adb 进程。输入后,后台的 logcat 就会乖乖停止录制了。)


更多推荐