一、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信息级别 |
- 例如:
"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