文章目录
-
- [一、 Monkey测试概述](#一、 Monkey测试概述)
- [二、 测试环境与准备](#二、 测试环境与准备)
- [三、 核心命令与参数配置](#三、 核心命令与参数配置)
-
-
- [1. 基础控制参数](#1. 基础控制参数)
- [2. 异常处理参数](#2. 异常处理参数)
-
- [四、 事件类型与比例控制(核心调优)](#四、 事件类型与比例控制(核心调优))
- [五、 高级用法与日志管理](#五、 高级用法与日志管理)
- [六、 结果分析与问题定位](#六、 结果分析与问题定位)
- [七、 实战演练与最佳实践](#七、 实战演练与最佳实践)
-
- 痛点解决:如何防止Monkey按Home/Back键退出App?
- 终极实战:1分钟高强度压测命令
- [进阶:Monkey + Logcat 双管齐下](#进阶:Monkey + Logcat 双管齐下)
一、 Monkey测试概述
1. 什么是Monkey测试?
Monkey是Android自带的一种伪随机压力测试工具 。它通过生成随机的用户事件(如触摸、滑动、按键等),模拟用户在高压和随机操作下的行为,主要用于测试App的稳定性 和健壮性。
2. 核心优缺点
- 优点:快速发现崩溃/ANR、无需编写复杂脚本、支持长时间自动化运行。
- 缺点:缺乏业务针对性(随机操作无法覆盖特定业务流程)、无法模拟复杂的业务逻辑。
二、 测试环境与准备
在开始测试前,需确保以下基础环境就绪:
- 安装配置 :安装Android SDK并配置好环境变量,确保
adb命令可用。 - 连接设备 :通过USB连接真机或启动模拟器,使用
adb devices确认设备已连接。 - 获取包名 :使用
adb shell pm list packages查询并确认待测App的包名(如com.tencent.mm)。 - 找到当前停留的包名 :
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. 日志导出
将日志保存到本地文件以便后续分析:
cmd
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次事件)
完美命令:
cmd
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 。它的作用就是:把命令藏到后台默默执行,表面上看起来什么都没发生。
你只需要复制下面这一整行命令,粘贴到你的黑框里,按下回车即可:
cmd
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中的写法)
c
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
-
按下回车后,你的黑框会发生什么?
- "摄像机"已隐藏开机 :
start /b会把adb logcat扔到后台默默录像(存入logcat.txt),黑框里不会有任何提示。 - "演员"立刻上场:紧接着,黑框里会立刻开始显示 Monkey 执行 100 次操作的进度。
- 表演结束 :大概 100 秒后,Monkey 跑完,黑框里重新出现
D:\...>的提示符,说明测试结束了。
- "摄像机"已隐藏开机 :
🎉 搞定!现在你的文件夹里已经同时生成了 log.txt 和 logcat.txt 两个文件。
- 唯一需要注意的"收尾工作"(必看)
虽然黑框里提示 Monkey 跑完了,但后台的"摄像机"(Logcat)还在傻傻地一直录像。
为了关掉它,当你看到黑框出现 D:\...> 提示符后,请紧接着输入下面这条命令并回车:
cmd
taskkill /F /IM adb.exe
(这条命令的意思是:强行结束所有的 adb 进程。输入后,后台的 logcat 就会乖乖停止录制了。)