1.简介
Monkey是Android系统自带的一款稳定性测试小工具,简单易用
2.环境搭建
(1)下载Android SDK
(2)将Android SDK目录下的platform-tools和tools目录配置到系统环境变量Path中
(3)打开cmd窗口,输入adb命令,查看环境是否配置成功,如下图所示,则环境配置成功
3.Monkey启动
(1)最简单的例子:命令行中输入 adb shell monkey 1000后,你会发现手机(或者虚拟机)自动运行起来了,命令行也会输出相关的日志。
(2)标准的Monkey命令:monkey [options] <count>
其中options表示Monkey执行可配置的参数,是可选项,如果不指定options,Monkey将以无反馈模式启动,并把事件任意发送到安装在目标环境中的全部包,count表Monkey执行的事件数,必须设置
(3)options的类型及其使用
下面将Monkey的Options操作分为四类:常规类,事件类,约束类和调试类。
常规类命令 | 使用 | 详解 |
---|---|---|
-h | adb shell monkey -h | 显示monkey参数帮助信息 |
-v | adb shell monkey -v -v -v<event-count> | 打印出日志信息,每个-v将增加反馈信息的级别,-v越多日志信息越详细:0级,除启动提示、测试完成和最终结果提供较少信息。1级,提供较详细调试信息,比如逐个发送到Activity的事件。2级,提供更详细安装信息,如测试中被选中或未被选中的Activity |
事件类命令 | 使用 | 详解 |
---|---|---|
-f | adb shell monkey -f<测试脚本名><event-count> | 表示要使用Monkey运行指定的脚本 |
-s | adb shell monkey -s<seed><event-count> | 指定随机数生成器seed值,如果用相同的seed值再次运行moneky,将重复执行刚才的随机操作 |
--throttle | adb shell monkey --throttle<时间间隔> | 表示每执行一个指令间隔的时间,单位ms,注意是-“--”开头 |
--pct-touch | adb shell monkey --pct-touch<percent> | 表示触摸事件百分比 |
--pct-motion | adb shell monkey --pct-motion<percent> | 表示动作事件百分比 |
--pct-trackball | adb shell monkey --pct-trackball<percent> | 表示轨迹球事件百分比 |
--pct-nav | adb shell monkey --pct-nav<percent> | 表示基本导航事件百分比 |
--pct-majornav | adb shell monkey --pct-majornav<percent> | 表示主要导航事件百分比 |
--pct-syskeys | adb shell monkey --pct-syskeys<percent> | 表示系统按键事件百分比 |
--pct-appswitch | adb shell monkey --pct-appswitch<percent> | 表示应用启动事件百分比 |
约束类命令 | 使用 | 详解 |
---|---|---|
-p | adb shell monkey -p<一个或者多个包名><event-count> | 指定测试一个或者多个包 |
-c | adb shell monkey -c<一个或者多个类别><event-count> | 指定测试一个或者多个类别(即<main-category>参数) |
调试类命令 | 使用 | 详解 |
---|---|---|
--dbg-no-events | adb shell monkey --dbg-no-events<event-count> | 监视应用程序所调用的包之间的转换 |
--hprof | adb shell monkey --hprof <event-count> | 在事件序列前后立即生成profiling report,在data/misc中生成5MB大小左右的文件 |
--ignore-crashes | adb shell monkey --ignore-crashes<event-count> | 设置后,当应用程序崩溃或者发生异常的时候,Monkey将继续运行直到计数完成,而不会停止运行 |
--ignore-timeouts | adb shell monkey --ignore-timeouts<event-count> | 设置后,当应用程序发生任何超时错误(比如ANR),Monkey将继续运行直到计数完成,而不会停止运行 |
--ignore-security-exceptions | adb shell monkey --ignore-security-exceptions<event-count> | 设置后,当应用程序发生任何相关权限错误的时候,Monkey将继续运行直到计数完成,而不会停止运行 |
--monitor-native-crashes | adb shell monkey--monitor-native-crashes<event-count> | 设置后,monkey会监视并报告Android系统的native code的崩溃事件 |
(4)Moneky脚本的编写
事件 | 使用 | 详解 |
---|---|---|
点击事件 | DispatchPointer ( downTime , eventTime , action , x , y , pressure , size , metaState , xPrecision , yPrecision , device , edgeFlags) | 其实这么多参数,只需要关注action 、 x 、y 三个参数即可。action :事件是按下还是抬起,0 表示按下,1 表示抬起。x、y:表示当前事件触发的X轴和Y轴的坐标 |
输入字符串事件 | DispatchString(String text) | 输入一个不加引号的字符串 |
启动应用 | LaunchActivity ( pkg_name , act_name ) | 用于打开任意应用的一个页面,但是前提条件是打开的Activity 需要属性 android:exported 被设定为true,才可以通过 LaunchActivity 打开 |
等待事件 | UserWait(long sleeptime) | 操作需要等待的事件,单位为毫秒 |
按下键值 | DispatchPress(int keycode) | 用于模拟敲击键盘的事件 |
长按键值 | LongPress(int keycode) | 用于模拟敲击键盘的事件 |
(5)准确地获取控件坐标
方法一:
因为Monkey是基于坐标来操作控件的,所以必须准确地获取控件坐标才能进行正确测试。这里就需要getevent。在命令行上输入adb shell getevent后,然后点击手机界面,会获得所点击的位置的十六进制坐标。
比如上图,我点击点一个文本框后输入的一系列数据(看起来好乱和复杂),每一行的三个数据分别代表type,code,value(具体的含义自己百度一下,这里就不多解释),然后其实我们只需要关注的是code为0035和0036这两行的数据,分别代表触屏时的绝对坐标X和Y,然后将它们转为十进制的坐标就可以了,就这样我们得到了控件的x和y坐标。
方法二:我推荐另外一种更简单的方式,来获取当前你看见的,在待测试设备上的控件的坐标点的定位方式。那就是利用 Android 设备的开发者选项。设置 → 开发者选项 → 指针位置 ,将这个属性开启之后,当手指在屏幕上滑动的时候,就可以在顶部看到当前触摸点的 X、Y 轴的坐标,这就是我们需要的。
(6)Monkey日志分析
- 正常情况: 如果Monkey测试顺利执行完成, 在log的最后, 会打印出当前执行事件的次数和所花费的时间; // Monkey finished 代表执行完成\
- 异常情况:Monkey 测试出现错误后,一般的分析步骤:
1.程序无响应的问题: 在日志中搜索 “ANR”
2.崩溃问题:在日志中搜索 “Exception” (如果出现空指针, NullPointerException) 肯定是有bug
4.Monkey简单实战
下面我们写一个简单的Monkey脚本进行测试:就是两个Activity页面,第一个页面输入EditText,然后第二个页面显示第一个页面的信息。(相信这部分代码对各位大佬来说很简单,就不粘贴出来了)
思路:
(1)选中文本框1
captureDispatchPointer(10,10,0,308,215,1,1,-1,1,1,0,0)
captureDispatchPointer(10,10,1,308,215,1,1,-1,1,1,0,0)
(2)往文本框1中输入内容
captureDispatchString(111)
captureDispatchPress(66)
(3)选中文本框2
captureDispatchPointer(10,10,0,197,295,1,1,-1,1,1,0,0)
captureDispatchPointer(10,10,1,197,295,1,1,-1,1,1,0,0)
(4)往文本框2中输入内容
captureDispatchString(222)
captureDispatchPress(66)
(5)点击提交按钮
UserWait(500)
captureDispatchPointer(10,10,0,264,403,1,1,-1,1,1,0,0);
captureDispatchPointer(10,10,1,264,403,1,1,-1,1,1,0,0);
(6)全部代码
(7)运行脚本,比如下面指定执行脚本10次,输出相关日志信息
5.Monkey总结
优点:功能强大, 主要用于压力和稳定性测试
缺点:本身不提供截屏功能,本身无法完成录制、回放的功能(不过都可以借用其他的开源工具来实现Monkey的截屏和录制等功能)
不支持条件判断,不支持读取待测界面的信息来执行验证操作