【性能测试】Android Monkey移动端测试工具使用手册
AndroidMonkey是AndroidSDK自带的命令行压力测试工具,通过伪随机事件流模拟用户操作来检测应用稳定性。本文系统介绍了Monkey工具的使用方法,包括:1)基础概念与工作原理,阐述其通过随机事件检测崩溃和ANR问题的机制;2)详细参数配置,包括测试范围控制、事件类型比例调整和日志管理;3)高级应用技巧,如自定义脚本、多设备并行测试和内存分析;4)实战案例以微信测试为例,展示完整测试
一、基础知识
1.1 工具定义与作用
Android Monkey是Android SDK自带的命令行压力测试工具,通过向设备发送伪随机用户事件流(如触摸、滑动、按键、屏幕旋转等),模拟用户操作以检测应用的稳定性和健壮性。其核心价值在于快速暴露应用在随机操作下的崩溃(Crash)、无响应(ANR) 等问题,适用于应用发布前的稳定性验证、回归测试及长时间压力测试场景。
1.2 工作原理
Monkey工具运行在Android设备或模拟器中,通过以下流程实现测试:
- 事件生成:基于伪随机算法生成用户事件(触摸、滑动等),支持通过参数控制事件类型及比例。
- 事件发送:将生成的事件流发送到Android系统事件队列,由系统分发给目标应用。
- 异常监控:实时监控应用状态,若发生Crash、ANR或权限异常,默认停止测试并记录日志(可通过参数设置忽略异常继续测试)。
- 结果输出:生成测试日志,包含事件序列、异常信息及测试统计数据。
1.3 环境搭建
1.3.1 前置条件
- 硬件:Android设备(真机/模拟器)、USB数据线(真机测试)。
- 软件:
- 电脑安装Android SDK(需包含
platform-tools
,提供adb
工具); - 设备开启开发者模式及USB调试(路径:设置→关于手机→连续点击“版本号”激活开发者模式,进入开发者选项开启USB调试)。
- 电脑安装Android SDK(需包含
1.3.2 环境验证
- 连接设备:通过USB连接真机,或启动模拟器,执行以下命令验证连接:
adb devices # 列出已连接设备,显示设备ID表示连接成功
- ADB环境测试:执行以下命令查看Monkey帮助信息,确认环境正常:
adb shell monkey -h # 输出Monkey参数说明
1.4 基本命令格式
Monkey命令的核心结构为:
adb shell monkey [参数] <事件总数>
- 必填项:
<事件总数>
(指定发送的随机事件数量,如1000
表示发送1000次事件)。 - 可选项:控制测试范围、事件类型、日志级别等(详见“常用技巧”章节)。
示例:对“计算器”应用发送1000次随机事件:
adb shell monkey -p com.android.calculator2 1000
二、常用技巧
2.1 核心参数详解
2.1.1 测试范围控制
参数 | 作用 | 示例 |
---|---|---|
-p <包名> |
指定测试的应用包名(仅允许启动该包内Activity) | -p com.tencent.mobileqq (测试QQ) |
-c <类别> |
限制启动的Activity类别(默认Launcher/Monkey) | -c android.intent.category.LAUNCHER |
2.1.2 事件类型与比例
通过--pct-<事件类型> <百分比>
调整各类事件占比(总和≤100%),常用事件如下:
参数 | 事件描述 | 典型场景 |
---|---|---|
--pct-touch |
触摸事件(屏幕单点按下-抬起) | 按钮点击、输入框触发 |
--pct-motion |
滑动事件(按下-随机移动-抬起,直线滑动) | 列表滚动、页面切换 |
--pct-appswitch |
Activity切换事件(启动新Activity) | 应用内页面跳转 |
--pct-rotation |
屏幕旋转事件(横竖屏切换) | 检测应用对屏幕方向变化的适配性 |
--pct-syskeys |
系统按键事件(Home、Back、音量键等) | 模拟用户返回、退出应用 |
示例:设置触摸事件40%、滑动25%、应用切换10%、旋转5%:
adb shell monkey -p com.tencent.mobileqq --pct-touch 40 --pct-motion 25 --pct-appswitch 10 --pct-rotation 5 20000
2.1.3 调试与日志参数
参数 | 作用 | 示例 |
---|---|---|
-v |
日志级别(-v:基础日志,-v -v:详细日志,-v -v -v:最详细日志) | -v -v -v (输出事件详情及Activity切换日志) |
--throttle <毫秒> |
事件间隔(控制测试速度,模拟真实用户操作) | --throttle 400 (事件间隔400ms) |
--ignore-crashes |
忽略应用崩溃,继续测试 | 测试中遇到Crash不停止,仅记录日志 |
--ignore-timeouts |
忽略ANR(应用无响应),继续测试 | 遇到ANR时不停止,仅记录日志 |
-s <seed值> |
固定随机数种子(相同seed生成相同事件序列,用于复现问题) | -s 1234 (种子值1234,可复现事件流) |
2.2 日志管理与分析
2.2.1 日志保存
通过重定向将日志保存到本地文件,便于后续分析:
adb shell monkey [参数] <事件数> > D:\monkey_log.txt # Windows
adb shell monkey [参数] <事件数> > ~/monkey_log.txt # Mac/Linux
2.2.2 关键日志筛选
测试完成后,通过以下关键词定位问题:
- Crash:搜索
CRASH
或Exception
(如NullPointerException
); - ANR:搜索
ANR in
或Application Not Responding
; - 事件序列:通过
-v -v -v
日志查看具体事件(如触摸坐标、按键类型)。
示例:从日志中提取Crash信息:
// CRASH: com.tencent.mobileqq (pid 12345)
// Short Msg: java.lang.NullPointerException
// Long Msg: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
2.3 高效测试策略
- 事件比例优化:根据应用特性调整事件占比,例如社交类应用可提高
--pct-touch
(触摸)和--pct-appswitch
(页面切换)比例; - 种子值复用:发现问题后,使用相同
-s <seed>
参数重新运行,复现事件序列; - 长时测试:结合
--throttle
控制速度,设置大量事件(如10万次)进行夜间稳定性测试。
三、高级使用
3.1 自定义事件脚本(MonkeyScript)
Monkey支持通过脚本文件(.script
)定义非随机事件序列,实现固定路径测试(如登录流程)。
3.1.1 脚本语法
脚本包含基础命令(如launchActivity
启动应用、tap
点击、drag
滑动等),示例如下:
# 脚本示例:启动计算器并执行1+2=3
type=user
count=10
speed=1.0
start data >>
launchActivity(com.android.calculator2, .Calculator) # 启动计算器
tap(100, 500) # 点击数字“1”(坐标需根据设备分辨率调整)
tap(200, 500) # 点击“+”
tap(100, 600) # 点击数字“2”
tap(300, 700) # 点击“=”
3.1.2 执行脚本
- 将脚本推送到设备:
adb push test.script /data/local/tmp/
- 执行脚本:
adb shell monkey -f /data/local/tmp/test.script 10 # 10为事件数(需≥脚本事件数)
3.2 结合ADB命令扩展功能
3.2.1 获取应用包名
- 方法1:通过
pm list packages
列出所有包名(-3
筛选第三方应用):adb shell pm list packages -3 # 列出第三方应用包名,如com.tencent.mobileqq
- 方法2:通过
logcat
监控应用启动:adb logcat | grep START # 启动目标应用,日志中“cmp=包名/Activity名”即为包名
3.2.2 生成内存快照
使用--hprof
参数在测试前后生成内存快照(.hprof
文件),用于分析内存泄漏:
adb shell monkey -p com.example.app --hprof 1000 # 测试后在/data/misc生成hprof文件
adb pull /data/misc/monkey.hprof D:\ # 拉取到本地,用Android Studio Profiler分析
3.3 多设备并行测试
通过-s <设备ID>
指定设备,实现多设备同时测试:
adb -s emulator-5554 shell monkey -p com.example.app 10000 # 设备1
adb -s emulator-5556 shell monkey -p com.example.app 10000 # 设备2
四、项目实操
4.1 测试场景:微信稳定性测试
4.1.1 测试目标
验证微信(包名com.tencent.mm
)在2小时随机操作下的稳定性,重点检测Crash、ANR及功能异常。
4.1.2 环境准备
- 设备:Android真机(型号:小米12,系统Android 13);
- 前置操作:登录微信账号,关闭锁屏,保持电量≥90%,连接WiFi。
4.1.3 测试命令
adb shell monkey -p com.tencent.mm \
--pct-touch 40 \ # 触摸事件40%
--pct-motion 25 \ # 滑动事件25%
--pct-appswitch 10 \ # 页面切换10%
--pct-rotation 5 \ # 屏幕旋转5%
-s 12345 \ # 种子值12345(用于复现问题)
--throttle 400 \ # 事件间隔400ms
--ignore-crashes \ # 忽略崩溃
--ignore-timeouts \ # 忽略ANR
-v -v -v \ # 详细日志
20000 > D:\wechat_monkey_log.txt # 事件数20000(约2小时),日志保存到本地
4.1.4 日志分析
- 打开
wechat_monkey_log.txt
,搜索CRASH
发现如下异常:// CRASH: com.tencent.mm (pid 18762) // Short Msg: java.lang.IndexOutOfBoundsException // Long Msg: java.lang.IndexOutOfBoundsException: Invalid index 5, size is 3
- 定位问题:根据堆栈信息,开发团队确认是“朋友圈列表滑动时数据越界”导致,后续版本修复。
4.2 测试报告输出
测试报告需包含以下内容:
- 测试概要:应用名称、包名、测试时长、事件数、设备信息;
- 问题统计:Crash次数、ANR次数、异常类型及触发场景;
- 日志片段:关键错误日志及截图(若结合截图工具);
- 优化建议:针对高频问题提出改进方向(如内存优化、异常捕获)。
五、常见问题
5.1 设备连接问题
问题描述:执行adb devices
无设备显示(device not found
)。
解决方案:
- 检查USB调试是否开启,重新插拔数据线或更换原装线;
- 重启ADB服务:
adb kill-server && adb start-server
- 安装设备驱动(如小米/华为需安装官方驱动)。
5.2 权限不足问题
问题描述:无法访问/data/anr/traces.txt
(ANR日志文件)。
解决方案:
- 设备root后直接拉取:
adb root # 获取root权限(仅部分设备支持) adb pull /data/anr/traces.txt D:\
- 非root设备:通过
adb bugreport
生成完整报告,从中提取ANR信息:adb bugreport D:\bugreport.zip # 生成报告后解压,在ANR文件夹中查找traces.txt
5.3 测试中断问题
问题描述:Monkey测试中途停止,日志显示Aborted
。
可能原因及解决:
- 应用崩溃未忽略:添加
--ignore-crashes
参数; - 系统按键退出应用:降低
--pct-syskeys
比例(如设为0%); - 设备资源不足:关闭后台应用,确保测试期间设备空闲。
六、工具总结
6.1 优缺点分析
优势 | 局限性 |
---|---|
1. 无需编写复杂脚本,上手成本低; | 1. 事件随机,无法覆盖特定业务路径; |
2. 支持长时间压力测试,暴露隐藏问题; | 2. 对自定义控件或WebView页面覆盖率低; |
3. 轻量集成于Android SDK,无需额外安装。 | 3. 日志分析需人工筛选,效率较低。 |
6.2 同类工具对比
工具 | 定位 | 适用场景 |
---|---|---|
Monkey | 随机事件压力测试 | 快速稳定性验证、冒烟测试 |
UI Automator | 控件级自动化测试 | 功能测试、路径固定的场景测试 |
Espresso | Android官方UI测试框架 | 单元测试、集成测试(需编写代码) |
AppCrawler | 基于控件遍历的测试工具 | 深度遍历测试、多页面覆盖测试 |
6.3 最佳实践建议
- 测试时机:功能测试完成后、版本发布前执行,结合CI/CD流程自动化触发;
- 参数组合:根据应用类型调整事件比例(如游戏类提高
--pct-motion
); - 结果分析:结合
Android Studio Logcat
、Sentry
等工具定位问题,优先解决高频Crash/ANR; - 进阶方向:通过二次开发Monkey源码(如添加截图、控件识别功能)或集成Maxim等增强工具提升测试效率。
通过本手册,可系统掌握Android Monkey测试工具的使用方法,从基础参数到高级脚本编写,结合实际项目场景实现高效的稳定性测试。
更多推荐
所有评论(0)