任务三 Monkey 压力测试
【任务描述】:前面的学习中每个动作都需要通过写代码来控制,如何通过简单命令模拟按键输入、触摸屏输入、手势输入等动作,实现APP应用软件的压力测试?
【任务目标】:掌握使用Monkey工具测试APP应用软件稳定性、健壮性的方法。
【任务储备】:
1、Monkey简介
Monkey 是 Android SDK中自带的自动化测试工具,运行在模拟器里或真实设备中的程序,可以生成用户事件随机流(单击、触摸、手势和系统级事件等)。Monkey测试中的所有事件都是随机的,不带任何主观性,常用于应用APP的压力测试,其运行示意图如下图所示。

2、Monkey参数
Monkey可以通过前缀adb shell执行相关的测试命令,或者通过进入shell并直接输入monkey命令来完成命令执行,monkey命令的基本语法如下所示。
adb shell monkey [options] <event - count>
参数类型分为基础参数、发送的事件类型和调试选项3类,具体的参数含义如下表所示。
表 1 Mokey常用参数列表
参数类型 | 参数名称 | 描述 |
基础参数 | -p | 用于约束限制,用此参数指定一个或多个package,指定包之后,monkey将只允许系统启动指定的APP,如果不指定包,monkey将允许启动设备中所有APP。参考示例: adb shell monkey -p com.android.calculator2 100 -p com.android.settings 100 说明:-p空格后面是软件包名;100表示测试事件次数 |
-v | 用于指定反馈日志的详细程度,总共范围内3个级别 日志级别 level 0 adb shell monkey -p com.android.settings -v 100 说明:仅提供启动提示,测试完成和最终结果等少量信息 日志级别 level 1 adb shell monkey -p com.android.settings -v -v 100 说明:提供较为详细的日志,包括每个发送到Activity的事件信息 日志级别 level 2 adb shell monkey -p com.android.settings -v -v -v 100 说明:提供最详细的日志,包括测试中选中(未选中的)Activity的事件信息 | |
-s | 用于指定伪随机数生成器的send值,如果send相同则两次monkey测试所产生的事件序列也相同。 | |
–throttle | 用于指定两个事件之间一个固定延迟,可以减缓monkey的执行速度。如果不指定,monkey将不会被延迟,事件将尽可能快地生成和发送消息。参考示例: adb shell monkey ---throttle 3000 -p com.android.settings 100 说明:向设置发送100次随机事件,每次事件间隔为3秒。 | |
发送的事件类型(各类事件类型的百分比总和不能超过100%) | –pct-touch | 触摸事件是指在屏幕某处按下并抬起的操作,模拟日常手机使用中的点击操作。参考示例: adb shell monkey –pct-touch 50 -p com.android.settings 100 说明:向设置发送100次随机事件,每次事件间隔为3秒。其中设定触摸的事件占比为50% |
–pct-motion | 滑动事件是指在屏幕某处按下、随机移动、抬起的操作,类似于我们日常的滑动屏幕翻页的操作。 | |
–pct-pinchzoom | 缩放事件是指在屏幕上的两处同时按下,并同时移动,最后同时抬起,模拟平时我们使用时的放大缩小操作。 | |
–pct-rotation | 屏幕旋转事件,这是一个隐藏事件,用于模拟手机的横竖屏切换。 | |
–pct-majornav | 主要导航事件是指点击“主要导航”按钮的操作。这些按键通常会导致UI界面的动作。如回退按键、菜单按键等。 | |
–pct-syskeys | 系统按键事件是指点击系统保留使用的按键操作,如点击 HOME键、返回键、音量调节键等 | |
–pct-anyevent | 其它类型事件除了上面的事件以外的其他事件。它包罗了所有其它类型的事件,如:按键、其它不常用的设备按钮、等等。 | |
调试选项 | –hprof | 需要root权限,指定了该参数,monkey会在发送事件的前后生成性能分析报告,通常会在data/misc目录下生成一个5MB左右大小的文件。 参考示例: adb shell monkey -p com.android.settings –hprof ---throttle 1000 –pct-touch 50 –pct-motion 50 -v -v -v 1000 >c:\monkey.txt 说明:向设置发送1000次随机事件,每次事件间隔为1秒。其中设定触摸事件占比为50%,滑动事件占比为50%,输出详细日志到C盘monkey.txt文件 |
–ignore-crashes | 用于指定当应用程序崩溃时(Force&Close错误)monkey是否停止运行。若使用此参数,即使应用程序崩溃,monkey依然会发送事件,直到事件计数完成。 | |
–ignore-timeouts | 通常情况下,当应用程序发生任何ANR(application not responding)错误时,monkey将停止运行。若指定了该参数,则monkey将会在产生错误信息后,继续向系统发送事件,直到指定事件全部运行完毕 | |
–ignore-security-exceptions | 通常情况下,指定应用程序发生许可错误时(如证书许可,网络许可等),monkey将停止运行。若指定了该参数,即使应用程序发生许可错误,monkey会继续向系统发送事件,直到指定事件全部运行完毕。 | |
–kill-process-after-error | 用于指定当应用程序发生错误时,是否停止其运行。如果指定此参数,当应用程序发生错误时,应用程序停止运行并保持在当前状态 (*注意:应用程序仅是静止在发生错误时的状态,系统并不会结束该应用程序的进程)。 | |
–monitor-native-crashes | 用于指定是否监视并报告应用程序发生崩溃的本地代码。 |
3、Monkey日志分析
Monkey日志一般由五部分组成:
第一部分:包含 seed值,执行次数、包名;
第二部分:被测设备上的所有应用包名,本次测试使用到了哪些包;
第三部分:各个事件所占百分比,日志只显示了事件的代号;
第四部分:具体事件;
第五部分:结论,在日志的最下端。如果有类似以下字段表示本次的Monkey没有异常,测试通过。
## Network stats: elapsed time=5123ms (5123ms mobile, 0ms wifi, 0ms not connected)
// Monkey finished
使用 Monkey 进行测试结束后,需要查看应用在测试中是否出现崩溃或无响应这类问题。测试结果可以通过如下方法判断:
(1) 在日志中搜索“CRASH”,如果搜到,可以判断 App 在测试过程中发生过崩溃问题;
(2) 在日志中搜索“ANR”(Application Not Responding),如果搜到,可以判断 App 在测试过程中发生过无响应的问题。ANR是一个比较严重的缺陷,一般是主线程的响应超过5秒,或者BroadcastReceiver没有在10秒内作出响应。
(3)在日志中搜索“exception”,看有无其他异常事件。
【任务实施】
1、使用monkey测试com.android.calculator包,向其发送100次随机事件,每次事件间隔为1秒,输出level 2日志,并将详细日志输出到本地电脑;
2、观察执行过程
3、分析monkey执行日志,查看是否有错误。
完整操作视频如下所示。

