adb之monkey测试
author: will
date:2024-03-11
monkey官方文档:http://www.android-doc.com/tools/help/monkey.html
一、简介
-
Monkey意指猴子🐒,顽皮淘气。所以Monkey测试,顾名思义也就像猴子一样在软件上乱敲按键,猴子什么都不懂,就爱捣乱。Monkey原理也是类似,通过向系统发送伪随机的用户事件流(如按键输入、触摸屏输入、滑动Trackball、手势输入等操作),来对设备上的程序进行压力测试,检测程序多久的时间会发生异常,在功能测试完成后进行monkey测试。
-
一般指用毫无规律的指令或操作去测试被测系统,观察被测系统的稳定性和容错性。
-
monkey包括很多选项,大致四大类:
1️⃣基本配置选项,如设置尝试的事件数量。
2️⃣运行约束选项,如设置只对单独的一个包进行测试。
3️⃣事件类型和频率。
4️⃣调试选项
-
monkey命令特性:
不可能使用monkey来指定做一样测试,重复做很多次。因为monkey产生的是伪随机的事件流。但是我们可以通过添加命令选项将操作限制在一定的范围内。 -
Monkey测试用于发现App测试中的问题(如ANR(Application Not Responding), 响应延时以及CRASH, 非正常退出)
二、原理
-
如果限定了Monkey运行在一个或几个特定的包上,那么它会监测试图转到其它包的操作,并对其进行阻止;
-
如果应用程序崩溃或接收到任何失控异常,Monkey将停止并报错;
-
如果应用程序产生了应用程序不响应(application notresponding)的错误,Monkey将会停止并报错;
-
-
Monkey程序由Android系统自带,使用Java语言写成,在Android文件系统中的存放路径是:/system/framework/monkey.jar;
-
Monkey.jar程序是由一个名为“monkey”的Shell脚本来启动执行,shell脚本在Android文件系统中的存放路径是:/system/bin/monkey;
-
通过在cmd窗口中执行:adb shell monkey {+命令参数}来进行Monkey测试;
-
三、架构
Monkey 运行在设备或模拟器上面,可以脱离PC运行(普遍做法是将monkey作为一个像待测应用发送 随机按键消息的测试工具。验证待测应用在这些随机性的输入面前是否会闪退或者崩溃)
四、事件类型
Monkey所执行的随机事件流中包含11大事件,分别是:
- 触摸事件百分比,即参数
--pct-touch
触摸事件是指在屏幕某处按下并抬起的操作,可通过–pct-touch参数来配置其事件百分比。
该事件由一组Touch(ACTION_DOWN)和Touch(ACTION_UP)事件组成,在手机上看到实际操作类似于点击。
- 滑动事件百分比,即参数
--pct-motion
手势事件是指在屏幕某处的按下、随机移动、抬起的操作,即直线滑动操作。可通过–pct-motion参数来配置其事件百分比。
该事件是由一个ACTION_DOWN事件、一系列ACTION_MOVE事件和一个ACTION_UP事件组成的,在手机上看到的实际操作是一个没有拐弯的直线滑动操作。
- 二指缩放事件百分比,即参数
--pct-pinchzoom
二指缩放事件是指在屏幕上的两处同时按下,并同时移动,最后同时抬起的操作,即智能机上的放大缩小手势操作。可通过–pct-pinchzoom参数来配置其事件百分比。
该事件起始是一个ACTION_DOWN事件和一个ACTION_POINTER_DOWN事件,即模拟两个手指同时点下;中间是一系列的ACTION_MOVE事件,即两个手指同时在屏幕上直线滑动;结束是由一个ACTION_POINTER_UP事件和一个ACTION_UP事件组成的,即两个手指同时放开。
- 轨迹事件百分比,即参数
--pct-trackball
轨迹事件是由一个或多个随机的移动组成的,有时会伴随着点击。很早之前的Android手机带有轨迹球,这个事件就是模拟的轨迹球的操作。现在的手机几乎都没有轨迹球,但轨迹球事件中包含曲线滑动操作,如果被测程序需要曲线滑动时可以选用此参数。可通过–pct-trackball参数来配置其事件百分比。
该事件是由一系列的Trackball(ACTION_MOVE)事件组成的,观察手机上的操作,即为一系列的曲线滑动操作。
- 屏幕旋转事件百分比,即参数
--pct-rotation
屏幕旋转事件是一个隐藏事件,在Android官方文档中并没有记录这个事件。它其实是模拟的Android手机的横屏和竖屏切换。可通过–pct-rotation参数来配置其事件百分比。
该事件由一个rotation事件组成,其中degree表示的是旋转方向,顺时针旋转,0表示旋转90度的方向,1表示旋转180度的方向,2表示旋转270度的方向,3表示旋转360度的方向。在执行过程中,可以看到手机屏幕在横竖屏之间不断地切换。
- 基本导航事件百分比,即参数
--pct-nav
基本导航事件是指点击方向输入设备的上、下、左、右按键的操作,现在手机上很少有上、下、左、右按键,这种事件一般用得比较少。可通过–pct-nav参数来配置其事件百分比。
该事件是由一个Key(ACTION_DOWN)和一个Key(ACTION_UP)组成的,点击的就是上、下、左、右四个方向按键。
- 主要导航事件百分比,即参数
--pct-majornav
主要导航事件是指点击“主要导航”按键的操作,这些按键通常会导致UI界面中的动作,如键盘的中间键、回退按键、菜单按键。可通过–pct-majornav参数来配置其事件百分比。
该事件是由一个Key(ACTION_DOWN)和一个Key(ACTION_UP)组成的,点击的按键就是中间键和菜单键。
- 系统按键事件百分比,即参数
--pct-syskeys
系统按键事件是指点击系统保留使用的按键的操作,如点击Home键、返回键、音量调节键等。可通过–pct-syskeys参数来配置其事件百分比。
该事件是由一个Key(ACTION_DOWN)和一个Key(ACTION_UP)组成的,点击的就是上面说到的几个系统按键.
- Activity启动事件百分比,即参数
--pct-appswitch
启动Activity事件是指在手机上启动一个Activity的操作。在随机的时间间隔中,Monkey将执行一个startActivity()方法,作为最大限度上覆盖被测包中全部Activity的一种方法。可通过–pct-appswitch参数来配置其事件百分比。
该事件是由一个Switch操作组成的,从手机上看,上面的操作实际是打开了com.android.settings这个应用的一个com.android.settings.Settings的Activity界面。
- 键盘事件百分比,即参数
--pct-flip
键盘事件主要是一些与键盘相关的操作。比如点击输入框、键盘弹起、点击输入框以外区域、键盘收回等。可通过–pct-flip参数来配置其事件百分比。
该事件主要是键盘的打开和关闭操作。
- 其他事件百分比,即参数
--pct-anyevent
其他类型事件包括了除前面提到的10种事件外其他所有的事件,如按键、其他不常用的设备上的按钮等。可通过–pct-anyevent参数来配置其事件百分比。
该事件是由一个Key(ACTION_DOWN)和一个Key(ACTION_UP)组成的,点击的按键就是其他的一些系统按键,如字母按键、数字按键等。因为现在手机很少带字母按键或数字按键,所以这个事件一般使用得比较少.
五、测试准备
- adb下载安装(参考👉ADB安装及使用详解(非常详细)从零基础入门到精通,看完这一篇就够了-CSDN博客)
- jdk下载安装(参考其他博客)
- adb基本命令(参考👉adb常用指令以及安卓端的实用操作-CSDN博客)
- 包名的获取方法
-
包名获取方法较多,此处只介绍几种:
adb shell pm list package
获取所有包名adb shell pm list package -3
获取第三方包名adb shell pm list package | grep “包名关键字”
adb logcat | findstr START
输入该命令,然后点击要启动的app,即可获取到包名和activity
adb shell dumpsys window w | findstr \/ | findstr name=
先打开app,再输入此行命令
六、命令解读
- 获取官方帮助文档
adb shell monkey --help
- -v:日志详细程度
注意:每一个-v将增加反馈信息的级别
Level 0(缺省值)除启动提示、测试完成和最终结果之外,提供较少信息 -v
Level 1提供较为详细的测试信息,如逐个发送到Activity的事件 -v -v
Level 2提供更加详细的设置信息,如测试中被选中的或未被选中的Activity -v -v -v
Note📖 : 一个-v及以上会显示详细的参数列表
Note📖 : 两个-v及以上会显示调用了哪些包哪些活动,还会显示睡眠时间
Note📖 : 三个-v没看出来多了啥😕
- -s:伪随机数生成器的seed值
Note📖 : 如果用相同的seed值再次运行Monkey, 两次monkey测试将生成相同的事件序列
- count参数
count无需显示指明,直接接上数字即可
eg:adb shell monkey -v 100
- –throttle:两次事件的时间间隔,单位是毫秒
Note📖 : 通过这个选项可以减缓Monkey的执行速度。如果不指定该选项,Monkey将不会被延迟,事件将尽可能快地被完成;
- -p:指定包名
用于约束限制,用此参数指定一个或多个package,指定包之后,monkey将只允许系统启动指定的APP,如果不指定包,monkey将允许启动设备中所有APP。
不指定包:adb shell monkey 100
指定一个包:adb shell monkey -p com.fileManager 100
指定多个包:adb shell monkey -p com.fileManager 100 -p fileManager 100*
-p空格后面是软件包名;100表示测试事件次数。
一个 -p 选项只能用于一个包,指定多个包,需要使用多个 -p 选项;
即使app崩溃,Monkey依然继续发送事件,直到事件数目达到目标值为止
- –pct-{+事件类型}{+事件类型的百分比}
Note📖 : 参数后面紧接着是百分比 0-100,百分比的总量不能大于100
adb shell monkey -p com.fileManager --pct-touch 50 --pct-motion 50 1000
- –ignore-crashes参数(忽略应用程序崩溃)
adb shell monkey -p com.fileManager --ignore-crashes -v 1000
Note📖 : 用于指定当应用程序崩溃时(Force& Close错误),Monkey是否停止运行。如果使用–ignore-crashes参数,即使应用程序崩溃,Monkey依然会发送事件,直到事件计数达到1000为止。
- –ignore-timeouts参数(忽略应用程序无响应)
adb shell monkey -p com.fileManager --ignore-timeouts -v 1000
Note📖 : 用于指定当应用程序发生ANR(Application No Responding)错误时,Monkey是否停止运行如果使用–ignore-timeouts参数,即使应用程序发生ANR错误,Monkey依然会发送事件,直到事件计数完成。
- –ignore-security-exceptions参数(忽略权限问题异常)
adb shell monkey --throttle 3000 --pct-trackball 50 -p com.fileManager --ignore-security-exceptions 100
Note📖 : 通常情况下,指定应用程序发生许可错误时(如证书许可,网络许可等),monkey将停止运行。若指定了该参数,即使应用程序发生许可错误,monkey会继续向系统发送事件,直到指定事件全部运行完毕。
- –kill-process-after-error参数(发生错误后停止运行)
adb shell monkey --throttle 3000 --pct-trackball 50 -p com.fileManager --kill-process-after-error 100
Note📖 : 用于指定当应用程序发生错误时,是否停止其运行。如果指定此参数,当应用程序发生错误时,应用程序停止运行并保持在当前状态(*注意:应用程序仅是静止在发生错误时的状态,系统并不会结束该应用程序的进程)。
- –monitor-native-crashes参数
adb shell monkey --throttle 3000 --pct-trackball 50 -p com.fileManager --monitor-native-crashes 100
Note📖 : 用于指定是否监视并报告应用程序发生崩溃的本地代码。
- –hprof参数
adb shell monkey -p com.fileManager --hprof --throttle 100 --pct-touch 50 --pct-motion 50 -v -v -v 1000 >d:\monkey.txt
Note📖 : 指定此选项(需要root权限),monkey会在发送事件前后生成性能报告(即内存的快照文件),一般在设备的/data/misc目录下生成一个5M左右的文件
- –dbg-no-events参数
adb shell monkey --throttle 3000 --dbg-no-events --pct-trackball 50 -p com.fileManager --monitor-native-crashes 100
Note📖 : 指定了此选项,monkey会启动待测应用,但不发送任何消息,建议与-v,-p,-throttle一起使用
- 参数常用配置
- 🚀–throttle: 一般建议设置为500(ms)🚀
- 🚀遇到错误: 不停止🚀
七、日志
1.日志作用
- Monkey日志管理是Monkey测试中非常重要的一个环节,通过日志管理分析,可以获取当前测试对象在测试过程中是否会发生异常,以及发生的概率,同时还可以获取对应的错误信息,帮助开发定位和解决问题。
2.错误类型
- 程序无响应📶:ANR(Application No Responding)
- 崩溃☹️:crash
- 异常😦:exception
- 强制退出❌:force closed
3.日志保存方法
- 保存在PC💻中
>adb shell monkey xxxxxx >d:\monkey.txt
- 保存在手机📱上
C:\Users\xxxxx>adb shell
monkey -v 100 >/sdcard/monkeylog.log
- 标准流和错误流分开保存
>adb shell monkey xxxxx 1>/sdcard/monkey.txt 2>/sdcard/error.txt
C:\Users\xxxxx>adb shell monkey -v 100 1>d:\monkey.log 2>d:\error.log
Note📖 : 执行以上命令,Monkey的运行日志和异常日志将被分开保存。此时Monkey的运行日志将被保存在monkey.txt文件中,而异常日志将被保存在D盘下的error.txt中。
Note📖 : 不添加末尾的输入流则默认不输入日志,在命令行输出。
Note📖 : 输入文件的方式默认是覆盖写。
4.日志分析
eg:
adb shell monkey -p com.xxxx --pct-touch 20 --pct-rotation 0 --pct-trackball 20 --pct-motion 20 --ignore-timeouts --ignore-crashes --ignore-security-exceptions --throttle 500 -v 100 >d:monkey\monkeylog.txt
Note📖 : 如果出现了问题,只需要重新输入此行指令加上
-s 1710465056930
即可复现
八、常见问题
- shell报错
/system/bin/sh: can't create D:\monkey\monkeylog.txt: Read-only file system
Note📖 : 无法写入文件的原因是设备shell只有对本设备有读写权限,而无法对PC上有写权限。因此不应该进入adb shell后执行monkey,应首先退出shell,加上adb shell一起执行