Monkey压力测试

文章目录

    • [一、 Monkey测试概述](#一、 Monkey测试概述)
    • [二、 测试环境与准备](#二、 测试环境与准备)
    • [三、 核心命令与参数配置](#三、 核心命令与参数配置)
        • [1. 基础控制参数](#1. 基础控制参数)
        • [2. 异常处理参数](#2. 异常处理参数)
    • [四、 事件类型与比例控制(核心调优)](#四、 事件类型与比例控制(核心调优))
    • [五、 高级用法与日志管理](#五、 高级用法与日志管理)
    • [六、 结果分析与问题定位](#六、 结果分析与问题定位)
    • [七、 实战演练与最佳实践](#七、 实战演练与最佳实践)

一、 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. 日志导出

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

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

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

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

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


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

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

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

cmd 复制代码
taskkill /F /IM adb.exe

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