Monkey是Android中的一个命令行工具,可以运行在模拟器里或实际设备中。它向系统发送伪随机的用户事件流(eg:按键输入、触摸屏输入、手势输入等),实现对正在开发的应用程序进行压力测试。
Monkey测试是一种可以测试软件的稳定性、健壮性的快速有效的方法。(可以想象成一只猴子啥都不知道,疯狂乱敲)
Android系统自带,使用java语言写成,在Android文件系统中的存放路径是:/system/framework/monkey.jar,Monkey.jar程序是由一个名为”monkey”的shell脚本来启动执行,shell脚本在Android文件系统中的存放路径是:/system/bin/monkey
(1)在CMD窗口查看monkey.jar:adb shell ls /system/framework
(2)在CMD窗口查看monkey:adb shell ls /system/bin
要获取Monkey命令自带的简单帮助,在cmd中执行命令: adb shell monkey –help
Monkey事件注入机制
Monkey注入系统事件是通过framework层的hidenApi(如activitemanager, inputmanager, windowmanager)获取系统服务,如下:
触摸事件:包括屏幕以及物理键的触摸,滑动,点击事件。
Monkey通过InputManager.getInstance().injectInputEvent(keyEvent, int);构造对应的事件,然后调用该接口执行事件。
Activity事件:是指我们调用Android系统组件的事件。
Monkey通过IActivityManager实例来获取activity的系统服务,从而启动某个activity。
IActivityManager am = ActivityManagerNative.getDefault();
am.startActivity();
Window事件:是指操作Window的事件,例如转屏。
Monkey通过获取IWindowManager实例开启系统窗口服务,并执行窗口事件。
IWindowManager wm = null;
wm = IWindowManager.Stub.asInterface(ServiceManager.getService("window"));
wm..thawRotation();//窗口转屏
Monkey的组织结构
Monkey的核心类是Monkey.java,MonkeyEventSource.java,MonkeyEvent.java。
类名 |
描述 |
Monkey |
程序的入口,同时也是调度中心,根据参数选择合适的MonkeyEventSource,并适时触发MonkeyEvent |
MonkeyEventSource |
MonkeyEvent的工厂,是一个接口,它有各种实现,例如随机生成MonkeyEvent,根据配置文件生成MonkeyEvent,根据网络数据生成MonkeyEvent等等 |
MonkeyEvent |
各种事件的具体实现,是一个抽象类,不同事件有不同实现。在Monkey中各种活动都是事件,除了基本的触摸事件,Activity事件外,事件之间的停顿也是通过一个MonkeyThrottleEvent来实现。这样概念的扩展,将各种活动一视同仁的对待,使设计变得简单。 |
1) 安装JDK
(1) 下载JDK:
https://www.oracle.com/technetwork/cn/java/javase/downloads/index.html
(2) 安装
(3) 配置环境变量,在“系统变量”中添加:
JAVA_HOME: 安装jdk的路径
CLASSPATH: .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;
在Path中添加:%JAVA_HOME%\bin” 和 “%JAVA_HOME%\jre\bin”
(4) 测试
输入java+回车,输出java的相关信息
输入javac+回车,输出java编译的相关信息
2) 下载Android sdk :
http://tools.android-studio.org/index.php/sdk/)
(1) installer_r24.4.1-windows.exe文件:
https://pan.baidu.com/s/1OYnj6-69q-pUQa2Pt7-Sbw 提取码:2ju1
(2) 安装installer_r24.4.1-windows.exe
里边有2个应用程序 ”SDK Manager.exe”(负责下载或更新SDK包)和” AVD Manager.exe”(负责创建管理虚拟机)
(3) 运行”SDK Manager.exe”进行SDK下载
刚开始选择10.0版,下载完后发现创建的模拟器无法启动,所以就下载了7.0版本,点击install packags开始安装(此处下载是为搭建虚拟机和环境变量做准备)
(4) 设置环境变量
a. 新建一个ANDROID_HOME的环境变量加入sdk的安装路径:
b. 在系统变量Path中加入如下值:
(5) 测试环境是否成功
运行DOS,输入:adb,出现如下结果,说明安装成功
(6) 创建虚拟设备
a. 打开AVD Manager.exe
b. 创建
c. 运行虚拟设备
点击后
进入DOS
(1) 查看设备是否连接成功:
adb devices
(2) 安装/卸载
安装:adb install 文件名.apk
卸载:adb uninstall 文件名.apk
(3) 获取包名:
显示所有apk包名包括系统:adb shell pm list package -f
显示正打开的程序:adb shell dumpsys window w | findstr \/ | findstr name=
(4) 压测
adb shell monkey -p your.package.name --throttle 500 -v -v -v 100 > d:MonkeyLog.txt
ps:
参数-p用于约束限制,用此参数指定一个或多个包
throttle 500——响应时间500ms
100是事件计数(即让monkey程序模拟100次随机用户事件)
-v -v -v 100 是一深度为三级输出测试信息,一个两个-v也可以效果不同
> d:MonkeyLog.txt——将log输出到d盘的MonkeyLog.txt文件
(5) log分析
问题搜索:
a. 无响应问题:ANR
b. 崩溃问题:CRASH
c. 内存泄漏:GC
d. 异常问题:Exception