什么是Monkey测试
Monkey 测试是通过向系统发送伪随机的用户事件流(如按键输入、触摸屏输入、手势输入等),实现对应用程序客户端的稳定性测试
Monkey 测试是为了测试软件的稳定性、健壮性
Monkey 程序需要通过 adb 来运行
Monkey测试操作步骤
安装并配置好 adb 环境,并通过 adb 连接好设备;
获取被测应用的包名;
执行 Monkey 命令进行测试
Monkey支持的事件
Monkey支持11种事件,主要是以下5种…
Touch触摸事件-即点击:由屏幕中的一个down-up事件,即在屏幕某处按下并抬起的操作
Trackball滚动球事件-即轨迹:由一个或多个随机的移动事件组成,有时会伴随着点击事件
motion滑动事件:由屏幕上某处一个down事件、一系列随机的移动事件和一个up事件组成
nav基本导航事件:由方向输入设备的上下左右按键所触发的事件组成
majornav主要导航事件:通常会导致UI界面中的动作事件,如5-way键盘的中间键,回退 按键、菜单按键
Monkey测试的特点
Monkey 测试,所有的事件都是随机产生的,不带人的主观性
1、测试的对象仅为应用程序包,有一定的局限性
2、Monky测试使用的事件数据流是随机的,不能进行自定义
3、可对MonkeyTest的对象,事件数量,类型,频率等进行设置
Monkey基本语法
$ adb shell monkey [options]
如果不指定options,Monkey将以无反馈模式启动,并把事件任意发送到安装在目标环境中的全部包。下面是一个更为典型的命令行示例,它启动指定的应用程序,并向其发送500个伪随机事件
Monkey命令参数
-p 用此参数指定一个或多个包。指定后只允许系统启动指定的app。不指定包则默认允许系统启动设备中的所有app
指定一个包:adb shell monkey -p <包名> <事件数>
指定多个包:adb shell monkey -p <包名> -p <包名> <事件数>
-v 用亍指定反馈信息级别(信息级别就是日志的详细程度),总共分3个级别:
Level 0:缺省值,仅提供启动提示、测试完成和最终结果等少量信息
adb shell monkey -p <包名> -v <事件数>
Level 1:提供较为详细的日志,包括每个发送到Activity的事件信息 app的归定的activity
adb shell monkey -p <包名> -vv <事件数>
Level 2:最详细的日志,包括了测试中选中/未选中的Activity信息 app的所有activity
adb shell monkey -p <包名> -vvv <事件数>
指定事件时间间隔
--throttle <millisenconds>:每个事件结束后的间隔时间,单位是毫秒
adb shell monkey -p 包名 --throttle <millisenconds>
-s(随机数种子):用于指定伪随机数生成器的seed值.每次操作按照一定的先后顺序所组成的一系列操作,即一个序列.每次执行完Monkey之后,从输出里可以看到当前的seed值,只要通过-s参数指定相同的seed,就可以重复刚才的操作。
设置种子数,<seednumber>:用于指定伪随机数生成器的seed(种子)值
adb shell monkey -p <包名> --throttle <millisenconds> -s <seednumber>
设置事件比例
默认情况下,如果不设置,会是--pct-anyevent为百分之百,也就是纯随机事件。如果通过其他的参数配置了之后,如果相加的百分比不为百分百,余下的百分比部分也会生成随机事件(-pct-anyevent 0,表示100%,输入20,表示20%)
--pct-touch <percent>:触摸事件的百分比
--pct-motion <percent>:滑动事件的百分比
--pct-trackball <percent>:轨迹球事件的百分比
--pct-nav <percent>:基本导航事件的百分比(比如输入设备上、下、左、右键)
--pct-majornav <percent>:主要导航事件的百分比(比如中间键、返回键、菜单键)
--pct-syskeys <percent>:系统按键事件的百分比(设定系统导航事件百分比,比如home键、back键、拨号键及音量键)
--pct-appswitch <percent>:activity之间切换的百分比(设定启动Activity事件百分比)
--pct-pinchzoom <percent>:缩放事件的百分比
--pct-rotation <percent>:屏幕旋转事件的百分比
--pct-flip <percent>:键盘事件的百分比
--pct-anyevent <percent>:任意事件(设定不常用事件百分比)
忽略异常
--ignore-crashes:忽略崩溃
--ignore-timeouts:忽略超时(忽略超时,app运行中如果超时可能会报错ANR)
--ignore-security-exceptions:忽略安全异常(该参数用于软件出现错误时,例如证书错误,网络错误等。Monkey是否继续运行直到计数完成)
--kill-process-after-error:发生错误后直接杀掉进程
--dbg-no-events:初始化启动的activity,但是不产生任何事件
--hprof:指定该项后再事件序列发送前后回立即生成分析报告
--monitor-native-crashes:跟踪本地方法的崩溃问题
--wait-dbg:直到链接了调试器才执行monkey测试
-bugreport:当ANR,系统无响应,Crash的时候获得bugreport
保存日志
方式一:adb shell monkey 1000> 文件路径/文件名
方式二:adb logcat -v time '*E' > monkey.log
实战
对抖爸爸直播app进行自动遍历测试
1、确定测试app的包名:com.dbbjt.phonelive
2、执行8小时,每300毫秒发送一个事件,则事件数=8*60*60*1000/300=96000
3、日志级别:-v-v-v
4、确定雪球中常用的操作类型和比例点击(点击70%,滑动10%,系统按键10%,其它10%)
5、确定seed值:1234567
6、确定调试选项:忽略闪退、忽略超时、忽略安全异常
7、重定向到文件中>monkey.log
adb shell monkey -p com.dbbjt.phonelive -vvv --pct-touch 70 --pct-motion 10 --pct-syskeys 10 -s 1234567 --ignore-crashes --ignore-timeouts --ignore-security-exceptions --throttle 300 96000 >monkey.log
日志分析
跑完monkey 之后,需要去确认有没有出现 bug? 最直观简单的方式就是通过搜索以下关键字:
.如果出现空指针 NullPointerException就一定是 bug
1、闪退问题:在日志中搜索"crash"
2、异常问题:在日志中搜索"Exception",常见的Java异常:
算术异常类:ArithmeticExecption
空指针异常类:NullPointerException
类型强制转换异常:ClassCastException
数组负下标异常:NegativeArrayException
数组下标越界异常:ArrayIndexOutOfBoundsException
违背安全原则异常:SecturityException
文件已结束异常:EOFException
文件未找到异常:FileNotFoundException
字符串转换为数字异常:NumberFormatException
操作数据库异常:SQLException
输入输出异常:IOException
违法访问错误:IllegalAccessError
内存不足错误:OutOfMemoryError
堆栈溢出错误:StackOverflowError
3、强制退出:在日志中搜索"force closed"
4、ANR(application no response)程序无响应:在日志中搜索"ANR"
monkey测试停止的条件
1、指令执行完成
2、遇到崩溃,或者异常
3、杀掉进程
monkey启动后需要杀掉进程
第一步,找到进程号: ps | grep monkey
第二步,杀进程: kill -9 进程号