Android测试之Monkey原理及源码分析(一)
一、monkey测试简介
Android app想要测试稳定性,monkey最佳。而monkey是继承于shell中的一段指令,使用java编写的,所以只要有adb就能使用monkey。
monkey测试原理
利用socket通讯方式来模拟用户的按键输入、触摸屏输入、手势输入等等,看设备多久出现异常。当monkey在设备上运行时,若用户触发event(如点击、输入等)或一些系统级别事件时,他就会产生随机脉冲,所以可以用monkey进行冒烟测试、随机测试、压力测试、稳定性测试。
二、monkey环境搭建
1.安装adb(https://blog.csdn.net/weixin_43273051/article/details/88809281)
2.安装Java JDK,并添加到环境变量
3.通过adb连接设备
Android测试之设备连接adb
三、monkey使用
monkey命令
adb shell monkey [options] <event-count>
eg:
adb shell monkey --pkg-whitelist-file /sdcard/whitefile.txt -v --throttle 300 --pct-touch 30 --pct-motion 20 --pct-nav 20 --pct-majornav 15 --pct-appswitch 5 --pct-anyevent 5 --ignore-crashes --ignore-timeouts --ignore-security-exceptions --ignore-native-crashes --bugreport 20000000
命令详解
event-count
1.event-count是一个蛮关键的参数,省略掉它只会打印monkey的help usage
PS C:\Users\dchen> adb shell monkey
usage: monkey [-p ALLOWED_PACKAGE [-p ALLOWED_PACKAGE] ...]
[-c MAIN_CATEGORY [-c MAIN_CATEGORY] ...]
[--ignore-crashes] [--ignore-timeouts]
[--ignore-security-exceptions]
[--monitor-native-crashes] [--ignore-native-crashes]
[--kill-process-after-error] [--hprof]
[--pct-touch PERCENT] [--pct-motion PERCENT]
[--pct-trackball PERCENT] [--pct-syskeys PERCENT]
[--pct-nav PERCENT] [--pct-majornav PERCENT]
[--pct-appswitch PERCENT] [--pct-flip PERCENT]
[--pct-anyevent PERCENT] [--pct-pinchzoom PERCENT]
[--pkg-blacklist-file PACKAGE_BLACKLIST_FILE]
[--pkg-whitelist-file PACKAGE_WHITELIST_FILE]
[--wait-dbg] [--dbg-no-events]
[--setup scriptfile] [-f scriptfile [-f scriptfile] ...]
[--port port]
[-s SEED] [-v [-v] ...]
[--throttle MILLISEC] [--randomize-throttle]
[--profile-wait MILLISEC]
[--device-sleep-time MILLISEC]
[--randomize-script]
[--script-log]
[--bugreport]
[--periodic-bugreport]
COUNT
2.那么event-count是啥呢?它是指随机发送事件总数,比如要发送100个随机事件,如下:
PS C:\Users\dchen> adb shell monkey 100
// activityResuming(com.android.documentsui)
Events injected: 100
## Network stats: elapsed time=1553ms (0ms mobile, 0ms wifi, 1553ms not connected)
options
1.options是指monkey的参数
2.options根据具体需求可分为4类:
·1)常规类:
- [-h]参数帮助信息
- [-v]打印日志信息,-v越多日志信息越详细(最多3个):1个-v除启动提示、测试完成、结果以外提供的信息较少;2个-v提供较详细信息,如事件类型、事件比例、逐个发送到activity信息等;3个-v提供更详细的信息。
·2)事件类:对随机事件进行频率调控,使其按照设置进行
- [-f scriptfile [-f scriptfile] …]用monkey运行指定的脚本,后面要接循环次数
eg:
adb shell monkey -f /sdcard/monkeyshell.mks 100
- [-s SEED]重复执行之前的随机操作
- [–throttle MILLISEC]给两个事件之间加上一个固定延迟(单位ms),默认是没有延迟的,而响应是需要一定时间的,这个参数很有用
- [–pct-touch PERCENT]调整触摸事件的百分比,在构造函数中各个事件有一个初始占比
- [–pct-motion PERCENT]调整动作事件的百分比
- [–pct-trackball PERCENT]调整轨迹球事件的百分比
- [–pct-syskeys PERCENT]调整系统按键事件的百分比
- [–pct-nav PERCENT]调整基本导航事件的百分比
- [–pct-majornav PERCENT]调整主要导航事件的百分比
- [–pct-appswitch PERCENT]调整应用切换事件的百分比
- [–pct-flip PERCENT]调整键盘事件的百分比
- [–pct-pinchzoom PERCENT]调整缩放事件的百分比
- [–pct-anyevent PERCENT]调整其他类型事件的百分比
注意:百分比总量不能超过100,而且touch和motion肯定是最频繁的,则可以提高这两种事件的比例;根据不同应用场景可以相应调整一些事件比例,比如视频类app,可以适当增加屏幕翻转事件的比例。
·3)约束类:将随件时间运行的范围约束在某几个包或类中
- [-p ALLOWED_PACKAGE [-p ALLOWED_PACKAGE] …]测试一个或者多个包,后接包名
- [-c MAIN_CATEGORY [-c MAIN_CATEGORY] …]测试一个类或者多个类,后接类名
·4)调试类:便于快速定位monkey运行中的问题
- [–ignore-crashes]设置之后,当应用程序崩溃或失控异常时,monkey将继续向系统发送事件直到完成event-count;若不设置,一旦遇到则停止运行。自动长跑过程中还是挺有用的
- [–ignore-timeouts]设置之后,当应用程序发生超时错误(像ANR),monkey将继续运行直到完成event-count;若不设置,一旦遇到则停止运行
- [–ignore-security-exceptions]设置之后,当应用程序发生任何权限错误(像启动需要权限的应用),monkey将继续运行知道完成event-count;若不设置,一旦遇到则停止运行
- [–monitor-native-crashes]设置之后,当应用程序遇到系统级native code的崩溃事件时,将被监视并报告;否则不会监视此类事件
- [–ignore-native-crashes]设置之后,当应用程序发生系统级native code崩溃时,monkey将继续运行直到完成event-count;若不设置,一旦遇到则停止运行
- [–kill-process-after-error]设置之后,当应用程序发生错误(包括system native code crash)停止时,将会通知系统杀掉发生错误的进程;若不设置,该进程将继续处于运行状态
- [–hprof]设置之后,将在monkey事件序列前后立即会在data/misc生成5M左右profiling report,要小心使用这个参数
- [–wait-dbg]设置之后,将暂停执行中的monkey,直到有调试器与它连接,这样可以在发生崩溃时抓一下log
- [–dbg-no-events]设置之后,monkey将进行初始启动,进入到某个测试Activity中不会进一步生成事件,通常与其他参数一起使用(像-v -p --throttle等)
3.TOUCH触摸事件:某个位置的一个按下并抬起的事件
4.MOTION动作事件:从某个位置按下后经过一系列为随机事件后弹起的事件
5.SYSKEYS系统按键事件:仅供系统使用的保留按键:HOME、BACK、拨号键、挂断键、音量键、切换键等
6.NAV基本导航事件:方向输入设备的上、下、左、右事件,手机上很少有这样的键,用得很少
7.MAJORNAV主要导航事件:会引起图形界面的一些动作,像返回键
8.APPSWITCH应用切换事件:随机时间间隔中,启动一个应用,即调用startActivity()最大限度开启该被测包中的所有应用
9.FLIP键盘事件:一些与键盘相关的操作,像点击输入框、键盘弹起、点击输入框以外区域、键盘收回等
10.PINCHZOOM缩放事件:在屏幕上的某两处同时按下,并同时移动,最后同时抬起的事件
11.ANYEVENT其他类事件:除了上面的事件以外的其他事件,像按键、其它不常用的设备按钮等
注意:monkey正常结束后,是不会停止启动的进程的,而是保持结束时间时的那个状态,而不会回到主界面