Monkey测试,就像一只猴子, 在电脑面前,乱敲键盘在测试。借助adb命令来让PC与Android设备连接,adb是一种Android调试工具,在PC上配置好环境即可使用。
通过Monkey程序模拟用户触摸屏幕、滑动Trackball、 按键等操作来对设备上的程序进行压力测试,主要目的就是为了检测程序多久的时间会发生异常(Crash、ANR、界面变形等)
Monkey包含多种选择,但是它们分为以下四种基本部分:
当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]
c)标准流与错误流分开保存 monkey [option]
Monkey 运行在设备或模拟器上面,可以脱离PC运行(普遍做法是将monkey作为一个像待测应用发送随机按键消息的测试工具。验证待测应用在这些随机性的输入面前是否会闪退崩溃)
Monkey虽然可以根据一个指定的命令脚本发送按键消息
1)不支持条件判断
2)不支持读取待测界面的信息来执行验证操作
3)不提供截屏功能,因此测试很难找到问题复现的场景
4)无法进行控件识别,对事件流控制能力很微弱
5)执行过程中容易误点工具栏导致Wi-Fi关闭,影响测试效果
6)无法自动解锁
-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进行查看
1)adb shell monkey -p your.package.name --pct-touch 30 --ignore-crashes --ignore-timeouts--throttle 250 -s 2 -v -v -v 5000000
黑名单的设置方法: 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
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、Google Search
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
1)图片放大缩小
2)输入框无限输入各种类型字符
3)快速操作
4)和系统的交互等等
# 控制 monkey 发送消息的 Monkey 头
type= raw events
count=10
speed=1.0
start data>>
# 在此之下,编写 monkey 脚本命令
# ...
注:
案例:type指明类型
count说明执行次数,但是这里改成任何值都执行一次,monkey命令可以指定执行次数,这里也就无所谓了
speed命令执行速率。改动无影响,可以通过monkey命令行指定。
以上三个参数改动都没什么影响,一般不做改动。start data >>相当于一个入口,说明脚本从下面开始执行
常用函数:
编写好脚本,保存为 monkey.mks 文件,并通过 adb push 将其上传到待测试的设备中。
adb push monkey.mks /data/local/tmp/
然后通过 monkey -f
执行此脚本,例如下面执行 10 次。
adb shell monkey -f /data/local/tmp/monkey.mks 10