- monkey 是发送伪随机事件的工具,这个手机自带。
- monkey是一个黑盒压力测试工具,采用随机算法,对被测应用随机发送伪随机的用户事件流,如点击,拖拽,滑动,输入等,来确定应用是否会发生异常,并且会产生日志来进行分析,但是测试数据测试事件都是随机的,有一定局限性。适合作为压力或者稳定性测试工具来测试应用的崩溃率,稳定性。但是可以通过二次开发来进行业务流程控制或一定程度上控制测试覆盖。
monkeyRunner :对monkey 命令进行封装后的api
3. 测试结果有两个我们需要关注解决的
crash 崩溃,app崩溃了
ANR app响应超时
------------------------------------------------------------------------------------------------------------
- 确认所需环境已经安装完毕,Android sdk和配置环境变量
- 将手机或者模拟器连接电脑,通过adb命令确认是否连接:
adb devices
3. 如果是device就代表已经连接成功,前面的一串字符就是设备号(手机的唯一标志名)
4. 测试APP安装包
adb install package.apk
5. 发送压测指令
adb shell monkey 1000
adb shell 工具名称 想要工具帮我们完成的指令数量
这些指令是monkey操作的,随机出现,包括:音量键,home,截图啊,滑动等操作
6. 获取APP包名
linux下:adb logcat | grep START
windows:adb logcat | findstr START
logcat输出手机上所有app的log日志,| 是管道,将前面的信息传递给后面的指令,包含START标志的日志
cmp后面就是包名/Activity名:
点击指定的APP就会输出log日志,cmp后面就有具体的包名和Activity名。这个就是你点击的APP的信息。
(1)查看指定apk的包名:aapt dump badging +包的全路径
(2)查看所有apk的包名:adb shell pm list package -f
ADB之查看当前运行应用、进程的包名与Activity名(Windows、Mac下均可)
mac:adb shell dumpsys window| grep mCurrentFocus
windows:adb shell dumpsys window| findstr mCurrentFocus
7. 常用
-p 指定要进行monkey测试的包,如果不使用参数,则会随机选择一个应用进行测试
-c 指定activity的category类别
-v 指定日志级别 -v level1 -v -v level2 -v -v -v level3
8. 给指定的APP(包)打压力
adb shell monkey -p packpage 1000
package:包名
1000:具体的指令数
比如:adb shell monkey -p com.mingx.PlatformApp 1000
----------------------------------------------------------------------------------------------------------
高级指令--Monkey高级参数的应用
- throttle参数
指定事件之间的间隔,后面加上间隔时间(单位是毫秒)
adb shell monkey --throttle <milliseconds>
adb shell monkey -p com.mingx.PlatformApp --throttle 1000 1000
解释:间隔1000毫秒(1秒)monkey执行一个指令,共执行1000个指令
- seed参数
指定随机生成数的seed值
adb shell monkey -s <seed> <event-count>
adb shell monkey -p com.mingx.PlatformApp -s 100 50
monkey所谓的随机操作是基于seed值产生的,每一个seed值都会产生一个操作序列;只要每次的seed值是一样的,那么操作序列也是一样的,说白了就是操作是一样的。
- 触摸事件
例子:假如只要求monkey完成点击事件,不操作其他的。
方法:设置触摸事件百分比,也就是在整个monkey实践中某个随机事件占多大比例(也就是百分之多少做这个操作嘛)
举例:--pct-touch 为点击事件
设定触摸事件百分比
adb shell monkey --pct-touch <percent>
adb shell monkey -p com.mingx.PlatformApp --pct-touch 100 100
--pct-touch后面是百分比
也就是说要求monkey完成百分百的点击事件(就是只做点击事件),共计100个。
adb shell monkey -v -p com.mingx.PlatformApp --pct-touch 100 100
加上-v就代表把monkey完成的事件列出来。
- 动作事件
在手机上点击一下完成一系列其他的操作到送起的这个过程。
设定动作事件百分比
adb shell monkey --pct-motion <percent>
adb shell monkey -v -p com.mingx.PlatformApp --pct-touch 50 --pct-motion 30 100
这些事件加起来要求等于100%;如果不等于百分百,则会随机做其他操作
结果:
- 轨迹球事件
设定轨迹球事件百分比
adb shell monkey --pct-trackball <percent>
- 基本导航事件
设定基本导航事件百分比,输入设备的上、下、左、右
adb shell monkey --pct-nav <percent>
- 主要导航事件
设定主要导航事件百分比,兼容中间键,返回键,菜单按键
adb shell monkey --pct-majornav <percent>
- 系统导航事件(主要和手机硬件相关的)
设定系统导航事件百分比,HOME、BACK、拨号及音量键
adb shell monkey --pct-syskeys <percent>
- Activity事件
一个APP里会有多个Activity事件,如果指定了切换Activity的比例的话,那么就会在已有的Activity中切换。
假如指定了30%;有4个Activity,在30%的事件中会在这4个Activity中切换。
设定启动Activity的事件百分比
adb shell monkey --pct-appswitch <percent>
- 不常用事件
设定不常用事件的百分比
adb shell monkey --pct-anyevent <percent>
如果在做压力测试时出现了CRASH,那么monkey就会停止。
- 忽略崩溃和异常
adb shell monkey --ignore-crashes <event-count>
增加了这句话就是发生CRASH时重启这个APP,但是错误日志还是会输出的,所以还是能够看到LOG日志的和seed值。
或者发生未响应(ANR)的时候:
- 忽略超时事件
adb shell monkey --ignore-timeouts <event-count>
CRASH结果的分析:
实践过程:
1. 安装可以引出CRASH的APP
2. 执行压力命令
3. 析取CRASH的Exception信息
共执行了1000次,在第445时出现了CRASH。seed值=1468814836964
所以如果想要复现这个CRASH,就可以指定seed值,就可以重现这个bug。
adb shell monkey -p package -s 1468814836964 1000
- 其余命令
--ignore-native-crashes 忽略native层代码的崩溃
--ignore-security-exceptions 忽略一些许可错误,比如证书许可,网络许可
--monitor-native-crashes 是否监视并报告native层发送的崩溃代码
--kill-procress-after-error 用于在发送错误后杀死进程
保存dos窗口打印的monkey信息,在monkey命令后面补上输出地址,如adb shell monkey -p xxx.xxxx.xxx -v -v 100 > D:\monkey.txt;这样monkey测试结束后,所有打印的信息都会输出到这个文件里





