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] >d:\monkey.txt

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 -s <限制语句> --throttle -v 执行次数> C:\blacklist_test.txt //执行黑名单以外的应用 monkey –pkg-whitelist-file /data/whitelist.txt -c -s <限制语句> --throttle -v 执行次数 > C:\whitelist_test.txt //执行白名单的应用

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、Google Search

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=10speed=1.0start 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 次。

更多相关文章

  1. android实现字体闪烁动画的方法
  2. 在Fragment中设置控件点击方法,执行失败。
  3. 细数Android(安卓)Studio中使用junit4测试框架中的坑
  4. Android(安卓)bluetooth介绍(四): a2dp connect流程分析
  5. Android(安卓)命令行编译、打包生成apk文件
  6. android 下写文件性能测试
  7. Ionic 运行报错No resource identifier found for attribute 'ap
  8. Android(安卓)之 AsyncTask 异步任务
  9. android 单元测试

随机推荐

  1. Android Gradle Plugin指南(六)——高级构
  2. mono for android Json 上传文件
  3. xe5 android listbox的 TMetropolisUILis
  4. 修改Android(安卓)hosts文件
  5. 资料分享
  6. Android 拦截 接收 短信
  7. Android开发:javah的使用方法
  8. 相对布局 relativelayout
  9. 网络框架之Glide
  10. Android简单计时器