Android Monkey 压力测试 介绍


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作为一个像待测应用发送随机按键消息的测试工具。验证待测应用在这些随机性的输入面前是否会闪退崩溃)

Android Monkey 压力测试 介绍_第1张图片

Monkey弱点

Monkey虽然可以根据一个指定的命令脚本发送按键消息

1)不支持条件判断

2)不支持读取待测界面的信息来执行验证操作

3)不提供截屏功能,因此测试很难找到问题复现的场景

4)无法进行控件识别,对事件流控制能力很微弱

5)执行过程中容易误点工具栏导致Wi-Fi关闭,影响测试效果

6)无法自动解锁

Monkey 参数大全

Android Monkey 压力测试 介绍_第2张图片

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、GoogleSearch

Monkey  日志分析

1)正常情况:顺利执行完成, 在log的最后, 会打印出当前执行事件的次数和所花费的时间; // Monkey finished 代表执行完成\

详细分析参考:

http://blog.sina.com.cn/s/blog_44d19b500102vefp.html

http://blog.csdn.net/huangyabin001/article/details/38442359

Android Monkey 压力测试 介绍_第3张图片

Android Monkey 压力测试 介绍_第4张图片

Android Monkey 压力测试 介绍_第5张图片

Android Monkey 压力测试 介绍_第6张图片

Android Monkey 压力测试 介绍_第7张图片

Android Monkey 压力测试 介绍_第8张图片

2)异常情况:

Android Monkey 压力测试 介绍_第9张图片

Android Monkey 压力测试 介绍_第10张图片

Android Monkey 压力测试 介绍_第11张图片

其中adb shell procrank 查询各进程内存使用情况;adb shell cat /proc/meminfo 查看当前的内存情况...

Android Monkey 压力测试 介绍_第12张图片

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)和系统的交互等等

Android Monkey 压力测试 介绍_第13张图片

关闭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 次。

你可能感兴趣的:(Android Monkey 压力测试 介绍)