一、Monkey简介
Monkey 是Android SDK提供的一个命令行工具, 可以简单,方便地运行在任何版本的Android模拟器和实体设备上。 Monkey会发送伪随机的用户事件流(如按键输入、触摸屏输入、手势输入等),适合对app做压力测试,主要目的就是为了测试app 是否会Crash。

- Monkey程序由Android系统自带,使用Java诧言写成,在Android文件系统中的存放路径是: /system/framework/monkey.jar;
- Monkey.jar程序是由一个名为“monkey”的Shell脚本来启动执行,shell脚本在Android文件系统中 的存放路径是:/system/bin/monkey;
如果你是一个android开发人员,当你把自己的环境搭建好之后,这个东西已经存在了,直接可以使用。
(一)、Monkey 命令启动方式
1)可以通过PC机CMD窗口中执行: adb shell monkey {+命令参数}来进行Monkey测试
2)在PC上adb shell 进入Android系统,通过执行 monkey {+命令参数} 来进行Monkey 测试
3)在Android机或者模拟器上直接执行monkey 命令,可以在Android机上安装Android终端模拟器
(二)、Monkey 参数
测试例子(com.haijia.test 是测试的应用包名):
adb shell monkey –p com.haijia.test –-throttle 100 –-pct-touch 50 –-pct-motion 50 –v –v 1000 >d:\monkey.txt

-v : 用于指定反馈信息级别(信息级别就是日志的详细程度),总共分3个级别,分别对应的参数如下 表所示:
// 缺省值,仅提供启动提示、测试完成和最终结果等少量信息
Level 0 : adb shell monkey -p com.haijia.test -v 100
// 提供较为详细的日志,包括每个发送到Activity的事件信息
Level 1 : adb shell monkey -p com.haijia.test -v -v 100
// 最详细的日志,包括了测试中选中/未选中的Activity信息
Level 2 : adb shell monkey -p com.haijia.test -v -v -v 100
-throttle <毫秒>
用于指定事件之间的间隔时间 ,单位是毫秒;如果指定这个参数,monkey会尽可能快的 生成和发送消息。 示例:
adb shell monkey -p pkgname --throttle 3000 100
-s(随机数种子)
用于指定伪随机数生成器的seed值,如果seed相同,则两次Monkey测试所产生的事件序列也相同的。 示例:
adb shell monkey -p pkgname –s 10 100
-p <允许的包名列表>
用此参数指定一个或多个包。指定包之后,monkey将只允许系统启动指定的app。如果丌指定包, monkey将允许系统启动设备中的所有app。
指定一个包:adb shell monkey -p pkgname 100
指定多个包:adb shell monkey -p pkgname1 –p pkgname2 100
touch:设置触摸事件
adb shell monkey -pct-touch :指定touch事件的百分比percent
motion:设置动作事件
adb shell monkey -pct-motion :指定motion事件的百分比percent
trackball:设置轨迹球事件
adb shell monkey -pct-trackball :指定轨迹球事件百分比percent
nav:导航事件设置
adb shell monkey -pct-nav :指定基本导航事件百分比percent
majornav:设置主要导航事件
adb shell monkey -pct-majornav :设定主要导航事件百分比percent,兼容中间键,返回键,菜单按键
syskeys:设置事件
adb shell monkey -pct-syskeys :设定系统事件百分比percent,比如HOME,BACK,拨号及音量调节等事件。
appswitch:启动Activity事件
adb shell monkey -pct-appswitch :设定启动activity的事件百分比percent
anyevent:不常用事件设置
adb shell monkey -pct-anyevent :设定不常用事件地百分比
syskeys:设置事件
adb shell monkey -pct-syskeys :设定系统事件百分比percent,比如HOME,BACK,拨号及音量调节等事件。
crashes :程序崩溃事件设置
adb shell monkey -ignore-crashes :忽略崩溃和异常事件
timeouts:超时事件设置
adb shell monkey -ignore-timeouts :忽略超时事件
(三)关于测试命令
1、adb install xx.apk:
把指定的安装包apk文件安装到测试设备中。

2、adb shell monkey:
给指定的设备发送压力测试,number是要测试的次数。执行这个命令的效果就相当于有个手指在你的手机上乱点。
adb shell monkey -p com.xx.xx 10
3、adb shell monkey -p pkgname:
同上面效果一样,只是对指定包名(pkgname)apk进行测试。

4、查看adb 版本
adb version
5、查看当前可用设备
adb devices
6、查看monkey 帮助
adb shell monkey -help
7、--ignore-crashes 运行中忽略crash,遇到crash依然把后面的事件跑完
adb shell monkey --ignore-crashes -v 100
8、--ignore-timeouts 运行中忽略ANR,遇到ANR依然把后面的事件跑完
adb shell monkey --ignore-timeouts -v 100
9、--ignore-native-crashes 忽略monkey本身的异常,直到事件执行完毕
adb shell monkey --ignore-native-crashes -v 100
10、运行并生成.txt的日志文件
adb shell monkey -p com.xxxx.xxx.xxx -v -v -v 1000 > Desktop/monkeytestOne.txt

(四)Monkey 日志分析
生成的文件大致如下(Monkey finished 代表执行完成):
:Monkey: seed=1506157309339 count=500
:AllowPackage: com.haijia.test
:IncludeCategory: android.intent.category.LAUNCHER
:IncludeCategory: android.intent.category.MONKEY
// Selecting main activities from category android.intent.category.LAUNCHER
// - NOT USING main activity com.android.calendar.AllInOneActivity (from package com.android.calendar)
// - NOT USING main activity com.android.contacts.activities.PeopleActivity (from package com.android.contacts)
// - NOT USING main activity com.android.contacts.activities.DialtactsActivity (from package com.android.contacts)
// - NOT USING main activity com.android.deskclock.AlarmsMainActivity (from package com.android.deskclock)
// - NOT USING main activity com.android.email.activity.Welcome (from package com.android.email)
// Seeded: 1506157309339
// Event percentages:
// 0: 15.0%
// 1: 10.0%
// 2: 2.0%
// 3: 15.0%
// 4: -0.0%
// 5: -0.0%
// 6: 25.0%
// 7: 15.0%
// 8: 2.0%
// 9: 2.0%
// 10: 1.0%
// 11: 13.0%
:Switch: #Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10200000;component=com.haijia.test/com.stub.plugin.Stub01;end
// Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.haijia.test/com.stub.plugin.Stub01 } in package com.haijia.test
Sleeping for 0 milliseconds
:Sending Key (ACTION_DOWN): 82 // KEYCODE_MENU
// Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.haijia.test/.activity.GuideActivity } in packagecom.haijia.test
// activityResuming(com.haijia.test)
:Sending Key (ACTION_UP): 82 // KEYCODE_MENU
Sleeping for 0 milliseconds
:Sending Touch (ACTION_UP): 0:(250.74362,575.5601)
Sleeping for 0 milliseconds
:Switch: #Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10200000;component=com.haijia.test/com.stub.plugin.Stub01;end
// Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.haijia.test/com.stub.plugin.Stub01 } in package com.haijia.test
Sleeping for 0 milliseconds
:Sending Key (ACTION_DOWN): 82 // KEYCODE_MENU
// Allowing start of Intent { cmp=com.haijia.test/.activity.LoginByPhoneActivity } in package com.zcya.vtsp
:Sending Key (ACTION_UP): 82 // KEYCODE_MENU
Sleeping for 0 milliseconds
Sleeping for 0 milliseconds
:Sending Trackball (ACTION_MOVE): 0:(-1.0,-2.0)
:Sending Trackball (ACTION_MOVE): 0:(3.0,1.0)
:Sending Key (ACTION_DOWN): 21 // KEYCODE_DPAD_LEFT
:Sending Key (ACTION_UP): 21 // KEYCODE_DPAD_LEFT
Sleeping for 0 milliseconds
:Sending Key (ACTION_DOWN): 82 // KEYCODE_MENU
:Sending Key (ACTION_UP): 82 // KEYCODE_MENU
Sleeping for 0 milliseconds
:Sending Key (ACTION_DOWN): 23 // KEYCODE_DPAD_CENTER
:Sending Key (ACTION_UP): 23 // KEYCODE_DPAD_CENTER
Sleeping for 0 milliseconds
:Sending Key (ACTION_DOWN): 22 // KEYCODE_DPAD_RIGHT
:Sending Key (ACTION_UP): 22 // KEYCODE_DPAD_RIGHT
:Sending Key (ACTION_DOWN): 23 // KEYCODE_DPAD_CENTER
:Sending Key (ACTION_UP): 23 // KEYCODE_DPAD_CENTER
Sleeping for 0 milliseconds
:Sending Key (ACTION_DOWN): 22 // KEYCODE_DPAD_RIGHT
// activityResuming(com.zcya.vtsp)
:Sending Key (ACTION_UP): 22 // KEYCODE_DPAD_RIGHT
Sleeping for 0 milliseconds
:Sending Key (ACTION_DOWN): 22 // KEYCODE_DPAD_RIGHT
:Sending Key (ACTION_UP): 22 // KEYCODE_DPAD_RIGHT
Sleeping for 0 milliseconds
:Sending Touch (ACTION_MOVE): 0:(389.88348,823.37866)
Events injected: 500
:Sending rotation degree=0, persist=false
// Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.zcya.vtsp/.activity.GuideActivity } in package com.zcya.vtsp
:Dropped: keys=0 pointers=2 trackballs=0 flips=0 rotations=0
## Network stats: elapsed time=4983ms (0ms mobile, 0ms wifi, 4983ms not connected)
// Monkey finished
异常情况
Monkey 测试出现错误后,一般的分析步骤
看Monkey的日志 (注意第一个swith以及异常信息等)
- 程序无响应的问题: 在日志中搜索 “ANR”
- 崩溃问题:在日志中搜索 “Exception” (如果出现空指针, NullPointerException) 肯定是有bug。
adb shell monkey -v –throttle 300 –pct-touch 30
–pct-motion 20 –pct-nav 20 –pct-majornav 15 –pct-appswitch 5
–pct-anyevent 5 –pct-trackball 0 –pct-syskeys 0 -p ‘%s’ 1000
网友评论