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

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容

  • 今天考试了,但是我没有做完。回到家我和妈妈说了,妈妈说让我跟小朋友们学习,好好跟老师学习,做一个优秀的小学生。
    张乐乐妈妈阅读 179评论 0 0
  • 有人问我:你听歌怎么都那么矫情。 我说:你一定是爱情里被爱的那个.. 1 有的时候,失恋是有原因的; 有的时候,失...
    沐森读书阅读 224评论 0 0
  • 今天心血来潮,翻出来我的秘密花园,哈哈~在网上找了教程,照着画了画~以下是绘画过程记录,欢迎感兴趣的同伴一起交流。...
    苧erSunShine阅读 5,151评论 0 0
  • 南方的雨总是缠缠绵绵,又带着刺骨的寒冷。跟你窝在厚厚的被窝里,听着你轻微的呼吸声,感受你传来的有力的心跳。 你穿着...
    苏谌阅读 656评论 0 0
  • 城市陌生 城市流离 或许某一天这座城市 终会让我委屈 每次我下车,脚触到它的土地 心里不高兴 但是我必须从万里赶来...
    破利村儿阅读 392评论 0 2