简介
Monkey是一个向系统发送伪随机的用户事件流,例如按键输入、触摸屏输入、滑动、手势输入等,来对设备上的程序进行压力测试,检测程序多久会发生异常,一般在功能测试完成后使用monkey进行测试。
为什么要压力测试?多久开始?
当App不稳定时,出现程序未响应、自动退出时或提高产品的留存率
一般在首轮功能测试完成后进行压力测试或者下班后的通宵测试
四大类
Monkey中配置许多选项,大致分为四大类。
- 基本配置选项:如设置尝试的事件数量
- 运行约束选项:如设置只单独对一个包的测试
- 事件类型和频率:如上下左右滑动截屏等,操作延迟(毫秒)
- 调试选项;
Monkey测试主要用于发现App测试中的问题,ANR:全称Application Not Responding(程序未响应;响应延时),CRASH(非正常退出)。App功能测试完成后会使用Monkey进行测试
Monkey运行原理
在Monkey运行的时候,它生成的事件,并把他们发送给系统。同时,Monkey还对测试中的系统进行检测,对下列三种情况进行特殊处理(自动停止):
- 限定了运行一个或者几个特定的包,那么它会监视视图转移到其他包的操作,并对其阻止
- 应用程序崩溃或接收到任何失控异常,Monkey停止并且会报错
- 应用程序产生了应用程序不响应(ANR)的错误,Monkey停止并且会报错
- 按照选定的不同级别的反馈信息,Monkey还可以看到执行过程报告和生成事件
Monkey的包
- Monkey程序由Android系统自带,使用Java语言编写,在Android文件系统存放路径为:/system/framework/monkey.jar
- Monkey程序是由一个名为'monkey'的shell脚本来启动执行,shell脚本在Android文件路径为:/system/bin/monkey
- 通过cmd中执行adb shell monkey { +命令参数 }来进行Monkey测试
Monkey的架构
Monkey运行在设备或模拟器上面,可以脱离PC运行(普遍做法是将monkey作为一个待测应用发送 随机按键的消息工具发送,验证待测试应用在这些随机性输入面前是否会闪退或者崩溃)
Monkey的指令参数
启动时环境
环境搭建已经搭建好的情况下,在cmd输入: adb devices
出现以上内容即是环境已经搭建好(adt和模拟器启动)
Monkey帮助命令:
adb shell monkey -help
获取包名
- 获取所有包名: adb shell pm list package
- 获取第三方包名: adb shell pm list package -3
- 获取包名和Activity: adb logcat | findstr START
红框1为包名,红框2为Activity
基础参数
-v反馈信息的详细级别,一般是-v -v -v,最多也详细,一般会指定日志路径保存,供开发人员查询Bug-sseed,序列值,种子值,可以指定重现日志的某个随机事件,一般程序功能修复后复现时会使用--throttle指定事件的间隔时间,monkey执行过快可以使用间隔时间使间隔时间慢下来,方便查看-p
指定包名,或者指定多个包名。如果不加-p会对整个安卓设备随机操作。-p 包名 -p 包名n+
发送的事件类型参数
注意:各类事件类型的百分比的【总和】不能超过100%,也就是说所有事件比例加起来等于100%
- 15%点击事件: --pct-touch
- 10%滑动事件: --pct-motion
- 2%缩放事件: --pct-pinchzoom
- 15%轨迹球事件: --pct-trackball
- 0%屏幕旋转事件: --pct-rotation
- 25%基本导航事件: --pct-nav
- 15%主要导航事件: --pct-majornav
- 2%系统按键事件: --pct-syskeys
- 2%Activity启动事件: --pct-appswitch
- 1%键盘唤出/隐藏事件: --pct-flip
- 13%其他事件: --pct-anyevent
上面百分比的总和刚好为100%
Monkey指令使用
基础参数
-p
**adb shell monkey -p 包名 100 **
- 指定一个包名模拟100次随机用户事件;
- -p 约束限制在该包内运行并且模拟,指定多个包需要多个-p进行约束
- 100:模拟用户操作100次
- 注意:不规定包那么monkey会运行启动的设备中所有的App
-v
adb shell monkey -p 包名 -v 100
- 日志Level 0级
- 日志级别用于指定反馈信息级别,信息级别就是详细程度
- 仅提供启动提示、测试完成和最终结果等少量信息
adb shell monkey -p 包名 -v -v 100
- 日志Level 1级
- 提供较为详细的日志,包括每个发送的Activity的事件信息
adb shell monkey -p 包名 -v -v -v 100
- 日志Level 2级
- 提供最详细的日志,包括了测试中未选中的Activity的信息
--throttle
用于指定用户操作(即事件)间的时间延时(时延),单位是毫秒;如果不设定这个参数那么Monkey会尽可能很快的生成和发送消息。
adb shell monkey -p 包名 --throttle 1000 -v 100
- 指定用户操作(事件)间的延迟
-s
adb shell monkey -p 包名 -s seed值 100
- seed值/种子值/序列值: 指的是随机生成数的seed值
- 使用相同的seed值再次运行monkey,将会生成相同的事件序列,对9个事件分配相同的百分比
事件参数
语法: --pct-{事件类别} {百分比}
用于指定每种类别事件的百分比;在monkey的运行中这种事件占的总事件的百分比
adb shell monkey -p 包名 --pct-touch15 -v 100
- 触摸事件(触摸事件是一个down-up事件,它发生在屏幕的某单一位置)
adb shell monkey -p 包名 --pct-motion 15 -v 100
- 调整动作事件(动作事件是由屏幕上某处一个down事件、一系列伪随机事件和一个up事件组成)
adb shell monkey -p 包名 --pct-trackball 10 -v 100
- 调整轨迹事件(轨迹事件由一个或几个随机的移动组成,有时候还伴随点击)
adb shell monkey -p 包名 --pct-nav 20 -v 100
- 调整基本导航事件(导航事件来自方向输入设备的up/down/left/right组成)
adb shell monkey -p 包名 --pct-majornav 20 -v 100
- 调整主要导航事件(这些导航通常引发图形界面中的动作,如键盘中间键,回退键,菜单键等)
adb shell monkey -p 包名 --pct-skskeys 20 -v 100
- 调整系统按键事件(这些按键通常被保留,由系统使用,如Home、Back、Start Call、End Call及音量组成)
adb shell monkey -p 包名 --pct-touch 50 --pct-motion 50 1000
- 指定多个类型事件的百分比.不能超过100%
运行错误事件参数
语法: --ignore-{错误事件参数}
adb shell monkey -p 包名 --ignore-crashes -v 100
- 即使App崩溃,monkey依然继续发送事件,直到事件数目达到目标值为止
- 说明:用于指定当前应用程序崩溃时(force&close错误),monkey是否停止运行。如果使 --ignore-crashes参数,即使应用程序崩溃,monkey依然会发送事件,直到事件数目达到为止
adb shell monkey -p 包名 --ignore-timeouts -v 100
- 即使App发生ANR,monkey依然会继续发送事件,直到事件数目达到目标值为止
- 说明:用于指定当前应用程序发生**ANR(application no responding,程序未响应)**错误时,monkey是否停止运行,如果使用 --ignore-timeouts参数,即使发生ANR错误,monkey依然会发送事件,直到事件数目到达为止
常见命令组合
- adb shell monkey -p 包名 -v 500 : 简单的输出测试信息;
- adb shell monkey -p 包名 -v -v -v 500 : 以深度为三级输出测试信息;
- adb shell monkey -p 包名 --port 端口号 -v :为测试分配一个专用的端口号,不过这个命令只能输出跳转的信息及有错误时输出信息;
- adb shell monkey -p 包名 -s seed值 -v 500 :为随机数的事件序列定一个值,若出现问题下次可以重复同样的系列进行排错;
- adb shell monkey -p 包名 -v --throttle 3000 500: 为每一次执行一次有效事件后休眠3000毫秒
Monkey测试建议
间隔时间:500毫秒
种子数:随机
遇到错误:不停止
执行时长:每机型不小于12小时或点击次数:100万次
机型覆盖建议:覆盖高中低端机型
不同芯片平台(高通、海思、MTK等)
不同分辨率(480*800以上主流分辨率)
不同安卓版本(安卓8.0以上主流安卓版本)
Monkey参考命令
adb shell monkey -p 包名 --throttle 500 --ignore-crashes --ignore-timeouts --ignore-security-exceptions --ignore-native-crashes -v -v -v 模拟次数>d:\monkeyScreenLog.log
--throttle 500 限制500毫秒
--ignore-crashes 程序崩溃时继续运行
--ignore-timeouts 程序未响应时继续运行
--ignore-security-exceptions 忽略安全异常,当程序发生许可错误时
--ignore-native-crashes 忽略本地崩溃
--monitor-native-crashes 检视本地崩溃
d:\monkeyScreenLog.log 日志生成到d盘目录下的monkeyScrennLog文件中
日志
典型的monkey测试日志文件输出,如下
主要Log日志文件说明
anr目录:从手机/data/anr导出的日志,保存anr和crash的相关信息
通过日志定位问题步骤
在monkeyScreenLog.log日志中搜索关键词'Fatal'、'Crash'、'ANR'定位发生的Crash的详细堆栈信息,或分析Crash前后的日志事件:
如图:
然后把相关的日志提交给开发即可。
版权归原作者 broprota 所有, 如有侵权,请联系我们删除。