Android Monkey压力测试介绍
Monkey 是Android SDK提供的一个命令行工具, 可以简单、方便地运行在任何版本的Android模拟器和实体设备上,Monkey会发送伪随机的用户事件流,适合对app做压力测试
一、环境搭建
安装Android SDK并配置环境变量,下载adt-bundle-windows-x86_64-20140702.zip安装包,根据自己的系统下载64或32位的adt,下载好后进行解压,自己放到一个目录中,打开解压后的文件夹后发现里面有如下文件或文件夹,如图:
eclipse:这是ADT的压缩包自带的Eclipse,支持Android开发,不需要在配置,不过现在建议大家使用Android Studio
sdk:这是Android的SDK,我们配置环境变量就配置到这里
SDK Manager:用来管理SDK 更新和下载的一个管理器
接下来我们就来配置环境变量:
ANDROID_HOME这个环境变量指定要sdk这个文件夹,例如:ANDROID_HOME=D:\software\adt-bundle-windows-x86_64-20140702\sdk
PATH环境变量上增加如下值:
PATH=%ANDROID_HOME%\tools;%ANDROID_HOME%\platform-tools;%ANDROID_HOME%\build-tools\android-4.4.2;
配置好环境变量后,重新打开cmd,执行adb version,出现如下图所示代表配置正确
启动安卓模拟器或安卓手机,在cmd中输入adb devices,出现device证明成功
二、什么是Monkey
顾名思义,Monkey就是猴子, Monkey测试,就像一只猴子, 在电脑面前乱敲键盘在测试,猴子什么都不懂, 只知道乱敲,通过Monkey程序模拟用户触摸屏幕、滑动Trackball、按键等操作来对设备上的程序进行压力测试,检测程序多久的时间会发生异常
三、Monkey 用来做什么
Monkey主要用于Android 的压力测试,自动的一个压力测试小工具,主要目的就是为了测试app是否会Crash
四、Monkey程序介绍
(1)Monkey程序由Android系统自带,使用Java语言写成,在Android文件系统中的存放路径是: /system/framework/monkey.jar;
(2)Monkey.jar程序是由一个名为“monkey”的Shell脚本来启动执行,shell脚本在Android文件系统中的存放路径是:/system/bin/monkey;
(3)Monkey命令启动方式:
a、可以通过PC机CMD窗口中执行: adb shell monkey {+命令参数}来进行Monkey测试
b、在PC上adb shell 进入Android系统,通过执行 monkey {+命令参数} 来进行Monkey 测试
c、在Android机或者模拟器上直接执行monkey 命令,可以在Android机上安装Android终端模拟器
五、Monkey 架构
Monkey 运行在设备或模拟器上面,可以脱离PC运行(普遍做法是将monkey作为一个像待测应用发送,随机按键消息的测试工具,验证待测应用在这些随机性的输入面前是否会闪退或者崩溃)
六、Monkey弱点
Monkey虽然可以根据一个指定的命令脚本发送按键消息,但其不支持条件判断,也不支持读取待测界面的信息来执行验证操作
七、Monkey 参数大全
八、Monkey命令基本参数介绍
1、标准的monkey命令
例如:adb shell monkey -v 500
产生500次随机事件
2、四大类选项:常用选项、事件选项、约束选项、调试选项
2.1 常用选项
--help 打印帮助信息
-v 指定打印信息的详细级别,一个-v增加一个级别,默认级别为0,总共分3个级别,分别对应的参数如下表所示:
Level 0 : adb shell monkey -p com.shjt.map -v 100 # 缺省值,仅提供启动提示、测试完成和最终结果等少量信息
Level 1 : adb shell monkey -p com.shjt.map -v -v 100 # 提供较为详细的日志,包括每个发送到Activity的事件信息
Level 2 : adb shell monkey -p com.shjt.map -v -v -v 100 # 最详细的日志,包括了测试中选中/未选中的Activity信息
2.2 事件选项
-s 指定产生随机事件种子值,相同的种子植产生相同的事件序列,实例:
monkey测试1:adb shell monkey -p com.shjt.map –s 10 100
monkey测试2:adb shell monkey -p com.shjt.map –s 10 100
--throttle 每个事件的间隔时间(毫秒),用于指定用户操作(即事件)间的时延,单位是毫秒;如果不指定这个参数,monkey会尽可能快的生成和发送消息
示例:adb shell monkey -p com.shjt.map --throttle 3000 100
--pct-touch 指定触摸事件的百分比
--pct-motion 指定滑动事件的百分比
--pct-trackball 指定轨迹球事件的百分比
--pct-nav 指定导航事件的百分比(up/down/left/right)
--pct-majornav 指定主要导航事件的百分比(back key、menu key)
--pct-syskeys 指定系统按键事件的百分比(Home、Back、startCall、endCall、volumeControl)
--pct-appswitch 指定activity之间的切换的百分比
--pct-anyevent 指定任意事件的百分比
2.3 约束选项
-p 指定有效的package,如果不指定包, 则对系统中所有package有效
指定一个包:adb shell monkey -p com.shjt.map 100
指定多个包:adb shell monkey -p fishjoy.control.menu –p com.shjt.map 100
-c activity必须至少包含一个指定的category,才能被启动,否则启动不了
2.4 调试选项
--dbg-no-events 初始化启动的activity,但是不产生任何事件
--hprof 指定该项后在事件序列发送前后会立即生成分析报告
--ignore-crashes 忽略崩溃
--ignore-timeouts 忽略超时
--ignore-security-exceptions 忽略安全异常
--kill-process-after-error 发生错误后直接杀掉进程
--monitor-native-crashes 跟踪本地方法的崩溃问题
--wait-dbg 知道连接了调试器才执行的monkey测试
九、Monkey 实例
adb shell monkey –p com.shjt.map –-throttle 100 –-pct-touch 70 –-pct-motion 30 –v –v 1000 > c:\monkey.txt
--pct-touch 70 --pct-motion 30,一个代表点击,一个代表滑动,两个加起来是100,执行1000次,代表不会进行其他事件操作,如轨迹事件(--pct-trackball),导航事件(--pct-nav)等等,指定这两种操作后,就极大的降低了monkey点到被测app外面的概率(触发到音量键等系统按键)
adb shell monkey –p com.shjt.map –s 100 --ignore-crashes --ignore-timeouts --monitor-native-crashes –v –v 1000 > monkey.log
十、Monkey 查看包名
手机中安装apk包名查看器,aapt命令查看
十一、Monkey 日志分析
正常情况,如果Monkey测试顺利执行完成,在log的最后,会打印出当前执行事件的次数和所花费的时间; # Monkey finished代表执行完成
异常情况
Monkey测试出现错误后,一般的分析步骤,看Monkey的日志(注意第一个switch以及异常信息等)
1. 程序无响应的问题: 在日志中搜索"ANR"
2. 崩溃问题:在日志中搜索"Exception"(如果出现空指针,NullPointerException)肯定是有bug
Monkey执行中断,在log最后也能看到当前执行次数
十二、必须重视Crash
虽然Monkey测试有部分缺陷,我们无法准确地得知重现步骤, Monkey测试所出现的NullPointException,都是可以在用户使用时出现的, 何时出现只是时间问题,理论上来说,Monkey所有的Crash都需要在发布前修复掉
十三、monkey运行脚本
脚本执行命令:
monkey -f <filename> count,例如monkey -f monkey.script 1