Android Monkey

一、Android Monkey介绍:

1.Monkey是Google提供的一个用于稳定性与压力测试的命令行工具
2.Monkey路径:

Monkey程序是Android系统自带的

路径:/system/farmwork/Monkey.jar 
启动脚本路径:/system/bin/Monkey

Monkey是由adb命令启动的,所以只要配置adb环境即可:
1.下载android SDK
2.环境变量配置很简单,百度一下就可以

3.命令格式:

1)直接PC启动

adb shell monkey[option] 
例如:”adb shell monkey 100”表示在设备上乱按100次

2)shell端启动

adb shell //进入手机终端命令 
monkey[option] //使用monkey命令

3)保存Monkey运行log

//保存在PC中: 
adb shell monkey [option] > d:monkey.txt 
//保存在手机中: 
monkey[option] >/mnt/sdcard/monkey.txt 
//标准流与错误流分开保存: 
monkey[option] 1>/mnt/sdcard/monkey.txt 2>/mnt/sdcart/error.txt

二、Monkey基本参数与事件参数

1.基本参数:

方法

说明

-help

打印帮助信息

 

-v

Monkey向命令行打印输出的log信息级别
默认级别0(-v):-v只打印启动信息,测试完成信息和最终结果信息
级别1(-v-v):-v打印执行时的一些信息,如发送事件
级别2(-v-v-v-v):-v -v打印最详细信息

 
 
  • 例如:
"monkey -help"
"monkey -v"
"monkey -v -v""monkey -v -v -v"

2.约束条件:

选项

说明

-P<允许执行的包名列表> 如果使用此参数指定一个或多个包,Monkey将只允许系统启动这些包里的Activity。如果你的应用程序还需要访问其他包里的Activity(如选取一个联系人),那些包也需要在此同时指定。如果不指定任何包,Monkey将允许系统启动全部包的Activity。要指定多个包需要使用多个-p选项,每个-p选项只能指定一个包
-c<意图的总类> 如果用此参数指定了一个或几个类别,Monkey将只允许系统启动这些类别中的某个类别列出的Activity。如果不指定任何类别,Monkey将选择下列类别中列出的Activity:Intent.CATEGORY_LAUNCHER或Intent.CATEGORY_MONKEY。要指定多个类别需要使用多个-c选项,每个-c选项只能用于一个类别
  • 注意:

1)使用-p启动必须在设备桌面上有图标才可以,-c就针对桌面没图标的应用。

2)Activity可以在应用的xml文件中<Activity>标签中查看

3)能用-p启动的应用,也就是在桌面上可以显示出图标的应用在xml文件的<Activity>标签中一定有这个:<category android:name="android.intent.category.LAUNCHER"/>

4)如果要使用-c参数,也就是要在xml文件的<Activity>标签中加入<category android:name="PackageName.MONKEY"/>相当于是我们自定义的。也是没有桌面图标的。自定义的时候最好是包名.Monkey,方便调用

  • 例如:
查询整个系统的包名命令:"adb shell pm list packages"可以在后面加">d:pag.txt"输出所有列表到d盘
//测试时钟100次,并输出信息
"adb shell monkey -p com.android.deskclock -v 100"
//测试时钟和email各100次,并输出信息
"adb shell monkey -p com.android.deskclock -p com.android.deskemail -v 100"
//使用-c参数。PackageName.MONKEY为注意事项4中改的
"adb shell monkey -c PackageName.MONKEY 300"

3.事件:

选项

说明

-s

伪随机数生成器的seed值。如果用相同的seed值再次运行Monkey,它将生成相同的事件序列

–throttle<毫秒>

在事件之间插入固定延迟。通过这个选项可以减缓Monkey的执行速度。如果不指定该选项,Monkey将不会被延迟,事件将尽可能快地被产生
–randomize-throttle 在事件之间插入随机延迟,需要与–throttle配合使用,随机延迟范围为(0–throttle设置的时间)
–pct-touch 调整触摸事件的百分比(触摸事件是一个down-up事件,它发生在屏幕上的某一个单一位置)
–pct-motion 调整动作事件的百分比(动作事件由屏幕上某一处的一个down事件、一系列的伪随机事件和一个up事件组成)
–pct-trackball 调整轨迹事件的百分比(轨迹事件由一个或几个随机的移动组成,有时还伴随有点击)
–pct-nav 调整”基本”导航事件的百分比(导航事件由来自方向输入设备的up/down/left/right组成)
–pct-majornav 调整”主要”导航事件的百分比(这些导航事件通常引发图形界面中的动作,如:5-way键盘的中间按键,回退按键,菜单按键等)
–pct-syskeys 调整”系统”按键事件的百分比(这些按键通常被保留,由系统使用,如Home,Back,音量控制键等)
–pct-appswitch 调整启动activity的百分比。在随机间隔里,monkey将执行一个startActivity()调用,作为最大程度覆盖包中全部Activity的一种方法
–pct-anyevent 调整其他类型事件的百分比。包括:按键、其他不常用的设备按钮等
–pct-filp 调整键盘换出隐藏的百分比
–pct-pinchzoom 调整两指缩放压缩手势的百分比
  • 注意:
1)-s 因为monkey是随机对actyivity进行操作,因此,当出现错误的时候如果需要复现或者回归,我们只需-s之前错误的事件序列就可以进行之前出错的按键操作
  • 例如:
//使用-s操作时钟应用上activity100次。如果不用-s的话,每次操作的seed值就会不同,那样就没法固定复现或者回归
"adb shell monkey -p com.android.deskclock -s 100 -v -v 100"
//以每次间隔200毫秒的延时操作时钟100次
"adb shell monkey -p com.android.deskclock --throttle 200 -v 100"
//以每次间隔0-200毫秒的随机延时操作时钟100次
"adb shell monkey -p com.android.deskclock --throttle 200 --randomize-throttle -v 100"
//以每次间隔0-200毫秒的随机延时操作时钟100次,每次操作都执行触摸操作(参数后面的100就是百分比数)
"adb shell monkey -p com.android.deskclock --pct-touch 100 --throttle 200 --randomize-throttle -v 100"
//对时钟操作100次,每次都执行轨动作事件(参数后面的100就是百分比数)
"adb shell monkey -p com.android.deskclock --pct-motion 100  -v 100"
//以此类推轨迹事件、基本导航事件、主要导航事件、系统按键事件、主要导航事件、等,需要注意的是百分比事件可以连用。按照百分比分配即可,当然所有事件的总和不能超过100

四、Monkey黑白名单

  • 黑名单:不测试的应用
  • 白名单:要测试的应用

如果要测试的应用太多,使用太多-p太麻烦,这时候就可以用刀黑白名单了,需要注意的是,黑名单和白名单只能设置一个

选项

说明

–pkg-blacklist-file apk黑名单,屏蔽掉黑名单中的apk不操作
PACKAGE_BLACKLIST_FILE apk黑名单,屏蔽掉黑名单中的apk不操作
–pkg-whitelist-file apk白名单,只操作包含在白名单红的apk
PACKAGE_WHITELIST_FILE apk白名单,只操作包含在白名单红的apk
  • 例如:
//假设设置黑名单:"com.android.contacts","com.android.launcher"首先先将这两个包名存放在一个txt文件中(一行一个包名)。比如说是:d:lacklist.txt。为了方便记忆,使用参数名作为文件名是一个不错的选择
//先将黑名单push到设备中,需要记住下面push到的路径。
"adb push d:reak.txt /data/local/tmp"
//除了黑名单外的整机测试,延时200毫秒操作300次
"adb shell monkey --keg-blacklist-file /data/local/tmp/blacklist.txt --throttle 200 300"
//白名单也是同理

五、Monkey结果解读

1.Monkey结果分类

  • Mlokey运行log输出,按照以下顺序输出:
1)测试命令信息        随机种子、运行次数、可运行的应用列表、各事件百分比
2)伪随机事件流        11大事件流
3)异常信息          ANR、CRASH等异常
4)测试结果信息        完成事件、旋转情况、案件情况、网络状态

2.Monkey结果详细解读


这里写图片描述

 

这里写图片描述

 

这里写图片描述

 

这里写图片描述

 

这里写图片描述

 

这里写图片描述

 

这里写图片描述

 

1)有一个隐藏属性,旋转。命令为:

adb shell monkey –pct-rotation 100 –throttle 2000 10//两秒间隔旋转10次

六、Monkey异常结果

1.Monkey异常结果

1)ANR输出异常格式:

//ANR无响应,哪一个进程没响应,进程号(Pid)是多少
System.err.println("//NOT RESPONDING:"+"(pid"+pdi+")");
  • 例:ANR输出log
//NOT RESPONDING:com.android.quicksearchbox(pid 6333)
//哪一个进程ANR
ANR in com.android.quicksearchbox(com.android.quicksearchbox/.SearchActivity)
//CPU使用情况
CPU usage from 8381ms to 2276ms ago:
//内存信息
procrank:→通过"adb shell procrank"命令输出
//trace信息
anr traces:→保存于/data/anr/traces.txt
//meminfo信息
meminfo:→通过"adb shell dumpsys meminfo"命令输出
//Bugereport信息
Bugreport:→通过"adb bugreport"命令输出,可用--bugreport参数控制

2)Creash输出异常格式:

System.err.println("//CREAAH:"+processName+"(pid"+pdi+")");//creash的进程名+进程号
System.err.println("//Short Msg:"+ShortMsg);//错误类型,短消息
System.err.println("//Long Msg:"+LongMsg);//错误类型,长消息
System.err.println("//Build Lable:"+Build.FINGERPRINT);//系统属性
System.err.println("//Build Changelist:"+Build.VERSION.INCREMENTAL);//系统属性
System.err.println("//Build Time:"+Build.TIME);//系统属性
System.err.pringln("//"+stackTrace.replace("
","
//"));//输出
  • 例:creash输出log:
//Crash:com.android.quicksearchbox(pid 1699)
//Short Msg:java.lang.NullPointerException
//Long Msg:java.lang.NUllPointException:Attempt to invoke virtual method'com.android.quicksearbox.SourceResult com.android.quicksearchbox.Suggestions.getResult()' on a null object reference
//可以通过"adb shell"进入手机后使用"getprop | grep 86"查看该系统属性
//Build Lable:generic/vbox86p:5.0/LRX21M/buildbot12160004:userdebug/test-keys
//可以通过"adb shell"进入手机后使用"getprop | grep bot"查看该系统属性
//Build Changelist:eng.buildbot.20141216.000103
//可以通过"adb shell"进入手机后使用"getprop | grep time"查看该系统属性
//Build Time:1318684697000
//java.lang.RuntimeException:Unable to stop activity{com.android.quicksearchbox/com.android.quicksearchbox.SearchActivity}:java.lang.NullPointerException:Attempt to invoke virtual method 'com.android.quicksearchbox.SourResult com.android.quicksearchbox.Suggestions.getResult()' on a null object reference
//at android.app.ActivityThread.performStopActivityInner(ActivityThread.java:3344)
//creash的一些信息
//at android.app.ActivityThread.performStopActivityInner(ActivityThread.java:3344)
//at android.app.ActivityThread.handleStopActivity(ActivityThread:java:3390)
//at android.app.ActivityThread.access$1100(ActivityThread:java:144)
//at android.app.ActivityThread$H.handleMessage(ActivityThread:java:1307)
//at android.os.Handler.dispatchMessage(Handler.java:102)
//at android.Looper.loop(Looper.java:135)

2.Java常见错误类型

  • 例如:
异常与错误类型
说明

java.lang.NullPointerException
空指针异常

java.lang.ArraIndexOutOfBoundsException
数组溢出

java.lang.ClassNotFoundException
类不存在

java.lang.ArithmeticException
数学运算异常

java.lang.IllegalArgumentException
方法参数异常

java.os.FileNotFoundException
文件未找到

java.lang.NumberFormatException
数值转化异常

java.lang.StackOverflowError
堆栈异常错误

java.lang.OutOfMemoryError
内存溢出错误

七、Monkey测试策略介绍

  • 策略例子1:整机测试,而不测试拨号盘应用,忽略所有错误,次数100万次
adb shell monkey --ignore-creashes --ignore-timeouts --pke-blacklist-file /data/local/tmp/blacklist.txt -v -v 1000000
  • 策略例子2:测试计算器30万次,随机种子为100,随机延迟0-1秒,忽略所有错误
adb shell monkey -p com.android.calculator2 -s 100 --throttle 1000 --randomize-throttle --ignore-creashs --ignore-timeouts -v -v 300000
  • 策略例子3:测试计算器,触摸事件30%,其他按键50%,错误停止,延时200
adb shell monkey -p com.android.calculator2 --throttle 200 --pct-touch 30 --pct-anyevent 50 -v -v 100000
  • 策略例子4:对计算器进行旋转压力测试,事件延时2秒,10W次
adb shell monkey -p com.android.calculator2 -pct-rotation 100 --throttle 2000 100000
  • 策略例子5:仅对整机的应用开启测试,事件延时5秒,10W次
adb shell monkey --pct-appswitch 100 --throttle 5000 100000
原文地址:https://www.cnblogs.com/JianXu/p/5162727.html