一、什么是monkey?
Monkey是Android中的一个命令行工具,可以运行在模拟器里或实际设备中。它向系统发送伪随机的用户事件流(如按键输入、触摸屏输入、手势输入等),实现对正在开发的应用程序进行压力测试。Monkey测试是一种为了测试软件的稳定性、健壮性的快速有效的方法。
二、monkey特点?
Monkey 程序是由 Android 系统自带,使用 Java 语言写成。在Android文件系统中的存放路径是:/system/framework/monkey.jar;
Monkey.jar程序是由一个名为“monkey”的Shell脚本来启动执行,shell脚本在Android文件系统中 的存放路径是:/system/bin/monkey;
也就是说monkey可以直接通过打包进测试工具中,被测试人员直接使用,网络上许多第三方的monkey工具就是通过对原生的Monkey.jar包进行二次开发实现。
三、monkey原理?
1). adb shell monkey的运行机制: 实际上是执行手机中/system/bin/monkey这个脚本;
2). Monkey事件注入机制:Monkey注入系统事件是通过 framework 层的 hidenApi (如:activemanager,inputmanager,windowmanager) 获取系统服务。
Monkey中有11种事件,这些事件在MonkeyEventSource中对事件之间的比例进行设置。Monkey事件根据类型比例生成事件队列,循环查找事件。
a.触摸事件(inputmanager):包括屏幕以及物理键的触摸,滑动,点击事件。
b.Activity事件(activemanager):是指我们调用Android系统组件的事件。
c.Window事件(windowmanager):是指操作Window的事件,例如转屏。
3).Monkey核心类
a. Monkey.java, 程序的入口,根据参数选择合适的MonkeyEventSource,并适时触发MonkeyEvent;
b. MonkeyEventSource.java, MonkeyEvent的工厂,是一个接口;
c. MonkeyEvent.java,各种事件的具体实现。
四、monkey架构图?
Monkey 运行在设备或模拟器上面,可以脱离PC运行(一般在一些大公司中都是将其抽离成一个测试专用的APP工具,使用相应的操作来完成测试)
五、测试准备?
1、首先需要将手机连接到PC,测试连接是否正常,可在cmd里输入adb devices来进行验证;
2、因测试多针对一个特定的APP包,所以需要获取测试包的包名;
方法一:直接问开发,
方法二:通过 adb shell pm list packages 列出所有包名来进行查找
(不确定包是否已安装,可以用adb shell pm list packages [options] <INTENT> 来进行确认,它的含义是列举出所有包含<INTENT>的package。 e.g. adb shell pm list packages com.taobao.taobao)。
方法三:启动设备上的测试app,同时输入下列命令查看当前活动的应用包名。
Android 7.0:adb shell dumpsys activity activities | findstr mFocusedActivity
Android 8.0:adb shell dumpsys activity activities | findstr mResumedActivity
或者:adb shell dumpsys window | findstr mCurrentFocus
3、对特定APP包进行测试的命令为adb shell monkey -p <pakage.name>
六、monkey命令参数详解?
示例:adb shell monkey -p com.chineseall.microbookroom --throttle 100 --ignore-crashes --ignore-timeouts --ignore-security-exceptions --ignore-native-crashes --monitor-native-crashes -v -v -v –s 1540475754297 100
-p *** 指定包名, 常用参数
--throttle 100 操作间隔100ms: 常用参数,一般设置为300毫秒,原因是实际用户操作的最快300毫秒左右一个动作事件,所以此处一般设置为300毫秒。
--ignore-crashes 忽略崩溃,继续执行, 常用参数
--ignore-timeouts 忽略超时, 常用参数
--ignore-security-exceptions 忽略许可错误, 常用参数
--monitor-native-crashes 指定是否监视并报告应用程序发生崩溃的本地代码
-s 用于指定伪随机数生成器的seed值,相同则两次事件序列也相同
-v -v -v 1>D:\monkey.txt 2>D:\error.txt & 存放在电脑路径上, 常用参数
-v -v -v 200 1>/mnt/sdcard/monkey.txt 2>/mnt/sdcard/error.txt & 存放在手机路径上
0 :标准输入
1 :标准输出
2 :标准错误输出
&:后台运行,拔掉数据线,不影响测试
>: 重定向,会覆盖原来文件里的内容
>>: 重定向,追加到原来文件末尾
0:--pct-touch <percent> 调整点击事件百分比,即在屏幕某处按下并抬起的操作事件:常用参数,此参数设置要适应当前被测应用程序的操作,比如一个应用80%的操作都是触摸,那就可以将此参数的百分比设置成相应较高的百分比。
1:--pct-motion <percent> 调整滑动事件百分比。(motion事件是由屏幕上某处一个down事件、一系列伪随机的移动事件和一个up事件组成):常用参数,需注意的是移动事件是直线滑动
2:--pct-pinchzoom <percent> 调整缩放事件百分比,不常用。
3:--pct-trackball <percent> 调整滚动球事件百分比。(滚动球事件由一个或多个随机的移动事件组成,有时会伴随着点击事件),不常使用参数,现在手机几乎没有滚动球,但滚动球事件中包含曲线滑动事件,在被测程序需要曲线滑动时可以选用此参数。
4:-pct-roration <percent> 调整旋转屏幕事件百分比。
5:--pct-nav <percent> 调整基本的导航事件百分比。(导航事件由方向输入设备的上下左右按键所触发的事件组成),不常用操作。
6:--pct-majornav <percent> 调整主要导航事件的百分比。(这些导航事件通常会导致UI界面中的动作事件,如5-way键盘的中间键,回退按键、菜单按键),不常用。
7:--pct-syskeys <percent> 调整系统事件百分比。(这些按键通常由系统保留使用,如Home、Back、Start Call、End Call、音量调节),不常用。
8:--pct-appswitch <percent> 调整Activity启动的百分比。(在随机的时间间隔中,Monkey将执行一个startActivity()调用,作为最大程度覆盖被测包中全部Activity的一种方法),不常用。
9:--pct-flip <percent> 调整唤出/隐藏键盘事件百分比。
10:--pct-anyevent <percent> 调整其他事件的百分比。(这包含所有其他事件,如按键、其他在设备上不常用的按钮等)不常用。
七、常用测试命令?
- adb shell monkey -p com.chineseall.microbookroom -v -v -v 20000 >D:\monkey.txt
- adb shell monkey -p com.chineseall.microbookroom --ignore-crashes --ignore-timeouts --ignore-security-exceptions --ignore-native-crashes --monitor-native-crashes -v -v -v 20000 >D:\monkey.txt
停止monkey:
- adb shell
- ps | grep monkey //查看monkey对应的进程数
- kill pid(前面会输出) // 杀进程
八、monkey日志分析? 参考: https://testerhome.com/topics/12212
测试结果初步判断:
1.monkey执行时未加--ignore-crashes 参数,就先浏览日志中Events injected: 值,查看当前已执行的次数,就知道有无bug
a、程序无响应,ANR问题:在日志中搜索“ANR”
b、崩溃问题:在日志中搜索“CRASH”
c、其他问题:在日志中搜索”Exception”
2.常见的Java异常:
算术异常类:ArithmeticExecption
空指针异常类:NullPointerException
类型强制转换异常:ClassCastException
数组负下标异常:NegativeArrayException
数组下标越界异常:ArrayIndexOutOfBoundsException
违背安全原则异常:SecturityException
文件已结束异常:EOFException
文件未找到异常:FileNotFoundException
字符串转换为数字异常:NumberFormatException
操作数据库异常:SQLException
输入输出异常:IOException
违法访问错误:IllegalAccessError
内存不足错误:OutOfMemoryError
堆栈溢出错误:StackOverflowError
其他,请参考:https://www.cnblogs.com/cvst/p/5822373.html
3.找到错误信息后,monkey里面的哪个Activity出错,在switch后面找,两个swtich之间如果出现了崩溃或其他异常,可以在该Activity中查找问题的所在。
查看Monkey里面出错前的一些事件动作,并手动执行该动作。Sleeping for XX milliseconds这是执行Monkey测试时,throttle设定的间隔时间,每出现一次,就代表一个事件,Sending XX 就是代表一个操作,如下图的两个操作 应该就是一个点击事件。
若以上步骤还不能找出,可以使用之前执行的monkey命令再执行一遍,注意seed值要一样。