Android Monkey 压力测试 介绍
什么是Monkey
Monkey测试,就像一只猴子, 在电脑面前,乱敲键盘在测试。借助adb命令来让PC与Android设备连接,adb是一种Android调试工具,在PC上配置好环境即可使用。
通过Monkey程序模拟用户触摸屏幕、滑动Trackball、 按键等操作来对设备上的程序进行压力测试,主要目的就是为了检测程序多久的时间会发生异常(Crash、ANR、界面变形等)
Monkey包含多种选择,但是它们分为以下四种基本部分:
基础设置选项,如设置将做事件的数目
操作限制,如限制某个单一包的测试
事件类型和频率
调试选项
当Monkey跑起来之后,就会产生事件,并将它们发送到系统。它也会关注测试下的系统情况,注意一下的三种情况会被特殊对待哦:
如果你限制了Monkey只能跑在某一个或更多个特定的包上时,它就会关注打算去跨越到其他包的企图,并阻止它们。
如果你的应用程序崩掉了或者接受到了其他种类的不可控异常,Monkey就会停掉,并report这个Error
如果你的应用程序生成了一个不发送error的应用,Monkey也会阻止并report这个Error
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终端模拟器 (适合同时测试多个apk)
(4)monkey结果输出
a)保存在pc中 adb shell monkey [option]
b)保存在手机中 adb shell monkey [option] >/mnt/sdcard/monkey.txt
c)标准流与错误流分开保存 monkey [option] 1>/mnt/sdcard/monkey.txt 2>/mnt/sdcard/error.txt
Monkey 架构
Monkey 运行在设备或模拟器上面,可以脱离PC运行(普遍做法是将monkey作为一个像待测应用发送随机按键消息的测试工具。验证待测应用在这些随机性的输入面前是否会闪退崩溃)
Monkey弱点
Monkey虽然可以根据一个指定的命令脚本发送按键消息
1)不支持条件判断
2)不支持读取待测界面的信息来执行验证操作
3)不提供截屏功能,因此测试很难找到问题复现的场景
4)无法进行控件识别,对事件流控制能力很微弱
5)执行过程中容易误点工具栏导致Wi-Fi关闭,影响测试效果
6)无法自动解锁
Monkey 参数大全
Monkey 命令 基本参数介绍
-p <允许的包名列表>
用此参数指定一个或多个包。指定包之后,monkey将只允许系统启动指定的app。如果丌指定包, monkey将允许系统启动设备中的所有app。
指定一个包:adb shell monkey -p com.shjt.map 100
指定多个包:adb shell monkey -p fishjoy.control.menu –p com.shjt.map 100
-v
用亍指定反馈信息级别(信息级别就是日志的详细程度),总共分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信息
-s(随机数种子)
用亍指定伪随机数生成器的seed值,如果seed相同,则两次Monkey测试所产生的事件序列也相同的。 示例:
monkey测试1:adb shell monkey -p com.shjt.map –s 10 100
monkey测试2:adb shell monkey -p com.shjt.map –s 10 100
注:说明一下什么是伪随机事件?
所谓伪随机事件,就是:seed相同,则随机序列不变;并且在一定时间内,所生成的随机事件不重复。
--throttle <毫秒>
用亍指定用户操作(即事件)间的时延,单位是毫秒;如果丌指定这个参数,monkey会尽可能快的 生成和发送消息。 示
例:adb shell monkey -p com.shjt.map --throttle 3000 100
更多其他高级的命令,可以通过adb shell monkey -h进行查看
Monkey 实例
用monkey 命令对app进行性能测试
说明:涉及到adb push的操作,须保证手机已root(手机端可以下载Root Explorer文件查看器,可以查看到根目录)
1)adb shell monkey -p your.package.name --pct-touch 30 --ignore-crashes --ignore-timeouts--throttle 250 -s 2 -v -v -v 5000000
触摸事件占30%,忽略crash和超时,每个事件间隔250ms,输出最详细日志,执行500万次(忽略了崩溃,在发生崩溃的时候,会继续执行,表现是又重新开始执行Monkey了,而同时,用-s 设定的seed值将不会生效。)
2)黑白名单(如何跑多个apk)
黑名单:执行除了黑名单中以外的apk;白名单:只执行在白名单中的apk
黑名单的设置方法: a.创建一个名称为blacklist的txt文档,在文件中输入应用程序的包名,如mms应用,则在文件中输入com.Android.mms;如果有多个应用程序不想被执行,则在文件中添加多个包名,注意包名与包名之间均用回车键。 b.将blacklist.txt的文件导入到手机的/data目录下,然后在执行monkey测试的时候使用--pkg-blacklist-file参数再加上blacklist文件的存储路径,其他的参数设置则和测试单一apk没有区别。 白名单的设置方法: 白名单的设置方法和黑名单的设置方法基本一致,只是在创建txt文档的时候,文件的命令应为whitelist。在执行monkey的时候,只执行白名单中的应用。
例子: monkey –pkg-blacklist-file /data/blacklist.txt -c
Monkey 的测试策略
1)单个apk的验收测试时,使用单一apk且不忽略异常的命令执行
2)单个apk的解决问题的测试时,使用单一apk且忽略异常的命令执行。这样可以在一次执行的过程中发现应用程序中的多个问题。
3)单个apk的应用程序的压力/健壮性测试时,主要缩短monkey测试中事件与事件之间的延迟时间,验证在快速的事件响应的过程中,程序是否能正常运行。将--throttle的值设定为500或者更小,一般都使用500毫秒的延迟事件。
4)在进行apk的集合测试(测试对象为多个APP)时,对于高频率使用的apk、长时间使用的apk都要包含在执行的应用程序中间。
APK分类具体:
高频率使用的apk如:Phone、Contacts、Message、Settings、File Manager、Gallery、Input Method
长时间使用的apk如:Phone、Browser、Music player、Camera、Video player、Email、Chat
其他的apk如:Calendar、Notepad、Calculator、FM Radio、GoogleSearch
Monkey 日志分析
1)正常情况:顺利执行完成, 在log的最后, 会打印出当前执行事件的次数和所花费的时间; // Monkey finished 代表执行完成\
详细分析参考:
http://blog.sina.com.cn/s/blog_44d19b500102vefp.html
http://blog.csdn.net/huangyabin001/article/details/38442359
2)异常情况:
其中adb shell procrank 查询各进程内存使用情况;adb shell cat /proc/meminfo 查看当前的内存情况...
Monkey 测试出现错误后,一般的分析步骤
看Monkey的日志 (为了进一步分析问题的来源,可以找到Log中出现问题处的前一次Switch,随后根据Log主要是查看相关的Activity)
1、程序无响应的问题:在日志中搜索 “ANR”
可能原因:当前有耗时操作在UI线程指定,导致卡UI了;在5秒内没有响应输入的事件(例如,按键按下,屏幕触摸);BroadcastReceiver在10秒内没有执行完毕
2、崩溃问题:在日志中搜索 “Exception” (如果出现空指针, NullPointerException) 肯定是有bug
3、搜索"crash" 、"error"
Monkey 执行中断, 在log最后也能看到当前执行次数;若以上步骤还不能定位问题,可以使用之前执行的monkey命令再执行一遍,注意seed值要一样
可能出现Crash的场景
1)图片放大缩小
2)输入框无限输入各种类型字符
3)快速操作
4)和系统的交互等等
关闭Monkey
在monkey运行中,断开USB连接,mokey仍可继续运行
1. ps命令查找进程
adb shell ps | grep monkey 返回来的第一个数字,即是monkey的进程号
2.kill 命令结束进程
adb shell kill [刚才查到的进程号]
MonkeyScript使用
一、官方提供的,除了像猴子一样随机乱点之外,还可以通过编写脚本的形式,完成一系列固定的操作。MS 提供一整套完善的 API 来进行支持,主要还是基于坐标点的操作,包含常用的:点击、长按、输入、等待等操作。
1)通过坐标来实现
2)可以针对某一个操作进行重复压力测试
3)会以.script 或者 .mks .txt来作为后缀,标识它是一个Monkey脚本。、
二、使用
1)API:http://mp.weixin.qq.com/s/akM-CslxhD6BY0RG1gGsrw
2)语法:
# 控制 monkey 发送消息的 Monkey 头
type= raw events
count=10
speed=1.0
start data>>
# 在此之下,编写 monkey 脚本命令
# ...
注:
type指明类型
count说明执行次数,但是这里改成任何值都执行一次,monkey命令可以指定执行次数,这里也就无所谓了
speed命令执行速率。改动无影响,可以通过monkey命令行指定。
以上三个参数改动都没什么影响,一般不做改动。
start data >>相当于一个入口,说明脚本从下面开始执行
常用函数:
案例:# Start of Script ---nuonuo
type= user
count= 49
speed= 1.0
start data >>
LaunchActivity(com.asn.nuonuo,com.asn.nuonuo.home.activity.SplashActivity2)
UserWait(100)
# 点击"我的“
DispatchPointer(10000,10000,0,1000,1800,0,0,0,0,0,0,0)
DispatchPointer(10000,10000,1,1000,1800,0,0,0,0,0,0,0)
UserWait(100)
# 点击"首页“
DispatchPointer(10000,10000,0,200,1800,0,0,0,0,0,0,0)
DispatchPointer(10000,10000,1,200,1800,0,0,0,0,0,0,0)
编写好脚本,保存为 monkey.mks 文件,并通过 adb push 将其上传到待测试的设备中。
adb push monkey.mks /data/local/tmp/
然后通过monkey -f执行此脚本,例如下面执行 10 次。
adb shell monkey -f /data/local/tmp/monkey.mks 10
在执行的过程中,就可以看到 MS 会自动启动我们待测试的 App ,然后按照我们的编写的测试脚本,进行重复执行 10 次。