Monkey测试
这段时间工作上出现变动,接触到Monkey测试,在这做个总结。
Monkey是一个在安卓上测试的工具包,功能实现不复杂,花了几个小时撸了一遍源码,将源码解读和搜集到的信息汇总一下。
Monkey测试概要
Monkey 是一个在模拟器或设备上运行的程序,可生成伪随机用户事件(例如点击、轻触或手势)流以及很多系统级事件。您可以使用 Monkey 以随机且可重复的方式对正在开发的应用进行压力测试。(这些介绍来自官网)
1.1 概览
Monkey 是一个命令行工具,可以在任何模拟器实例或设备上运行。它会将伪随机用户事件流发送到系统中,从而对您正在开发的应用软件进行压力测试。
Monkey 包含许多选项,主要分为以下四个类别:
- 基本配置选项,例如设置要尝试的事件数。
- 操作限制条件,例如将测试对象限制为单个软件包。
- 事件类型和频率。
- 调试选项。
Monkey 在运行时会生成事件并将其发送到系统。它还会监视被测系统并查找三种特殊情况:
- 如果您已将 Monkey 限制为在一个或多个特定软件包中运行,它会监视并阻止转到任何其他软件包的尝试。
- 如果应用崩溃或收到任何未处理的异常,Monkey 会停止并报告错误。
- 如果应用生成“应用无响应”错误,Monkey 会停止并报告错误。
根据您选择的详细程度级别,您还将看到有关 Monkey 进度和所生成事件的报告。
1.2 Monkey 的基本用法
可以使用开发计算机上的命令行启动 Monkey,也可以通过脚本启动。由于 Monkey 在模拟器/设备环境中运行,因此您必须从该环境中通过 shell 启动它。
为此,您可以在每个命令前面加上
adb shell
,或者直接进入 shell 并输入 Monkey 命令。所以需要先安装SDK以支持adb命令基本语法如下:
$ adb shell monkey [options] <event-count>
如果未指定任何选项,Monkey 将以静默(非详细)模式启动,并将事件发送到目标上安装的任何(及所有)软件包。
下面是一个更典型的命令行,它会启动您的应用并向其发送 500 个伪随机事件:
$ adb shell monkey -p your.package.name -v 500
1.3 命令选项参考信息
https://developer.android.google.cn/studio/test/other-testing-tools/monkey?hl=zh_cn
1.4 Monkey框架
参考:http://www.uml.org.cn/Test/202004211.asp?artid=23192
1.5 业界Monkey测试
(1)百度SmartMonkey
基于Robotium自动测试框架,开发了SmartMonkey工具
- 1 准确识别页面上的操作,避免无效点击
- 2 支持关键路径配置,使测试范围可控
- 3 操作优先级动态变化,覆盖更多功能和页面
- 4 多进程基础性能信息自动采集
- 5 支持Checklist配置,提供简单的功能验证
- 6 结合性能专项工具,进一步挖掘性能隐患
参考:https://mp.weixin.qq.com/s?__biz=MzA5NjcxMDU5MQ==&mid=2650045323&idx=3&sn=0aa884012c07c8b8d7c6cb97dfef2fb9&scene=21#wechat_redirect
(2)腾讯NewMonkey
基于控件和加权。
2. Monkey功能
以下内容根据源码解读。
源码地址:https://android.googlesource.com/platform/development/+/refs/heads/android12-release/cmds?autodive=0
2.1 运行机制
(1)monkey是基于事件的测试工具包
(2)支持命令行、脚本、网络的方式接收指令,启动Monkey测试。
(3)执行入口,monkey可执行文件
# Script to start "monkey" on the device, which has a very rudimentary # shell. # base=/system export CLASSPATH=$base/framework/monkey.jar trap "" HUP for a in "$@"; do echo " bash arg:" $a done exec app_process $base/bin com.android.commands.monkey.Monkey "$@"
(4)在命令中count参数决定触发多少次事件,对应测试多长时间。
(5)在所有事件运行完后,记录日志
(6)随机的生成,依赖mFactors数组中百分比,伪随机是指数组中元素对应的事件是固定的,只是百分比不同,如mFactors[0]是touch事件
2.2 事件类型
顶层父类:MonkeyEvent
类型
|
MonkeyEvent实现
|
备注
|
key事件
|
MonkeyKeyEvent
|
|
touch事件
|
MonkeyTouchEvent
|
继承自MonkeyMotionEvent,还支持多次touch事件(根据参数个数判断)
|
trackball事件
|
MonkeyTrackballEvent
|
继承自MonkeyMotionEvent
|
wait事件
|
MonkeyWaitEvent
|
sleep,模拟操作间有间隔
|
profileWait事件
|
MonkeyWaitEvent
|
|
rotation事件
|
MonkeyRotationEvent
|
|
tap事件
|
MonkeyTouchEvent
|
生成ACTION_DOWN和ACTION_UP 2个事件
|
pressAndHold事件
|
MonkeyTouchEvent
|
生成ACTION_DOWN和ACTION_UP 2个事件,
两个事件之间存在 pressDuration 的wait时间
|
drag事件
|
MonkeyTouchEvent
|
生成ACTION_DOWN和ACTION_UP 2个事件,
两个事件之间多次ACTION_MOVE事件
|
pinchAndZoom事件
|
MonkeyTouchEvent
|
生成ACTION_DOWN和ACTION_UP 2个事件,
两个事件之间多次ACTION_MOVE、
ACTION_POINTER_DOWN、
ACTION_POINTER_INDEX_SHIFT事件
|
flip事件
|
MonkeyFlipEvent
|
键盘事件
|
launch事件
|
MonkeyActivityEvent
|
|
wakeUp事件
|
MonkeyActivityEvent、
MonkeyKeyEvent
|
涉及锁屏、解锁等事件
|
launchInstrumentation事件
|
MonkeyInstrumentationEvent
|
|
keypress事件
|
MonkeyKeyEvent
|
生成ACTION_DOWN和ACTION_UP 2个事件,并携带参数keyCode,
两个事件之间无时间间隔
|
longpress事件
|
MonkeyKeyEvent
|
生成ACTION_DOWN和ACTION_UP 2个事件,并携带参数KEYCODE_DPAD_CENTER,
两个事件之间存在 2ms 的wait时间
|
powerLog事件
|
MonkeyPowerEvent
|
The power log event is mainly for the automated power framework
|
writeLog事件
|
MonkeyPowerEvent
|
无参
|
runCmd事件
|
MonkeyCommandEvent
|
运行shell命令
|
dispatchString事件
|
MonkeyCommandEvent
|
通过shell命令传入参数
|
StartCaptureFramerate事件
|
MonkeyGetFrameRateEvent
|
参数:start
|
EndCaptureFramerate事件
|
MonkeyGetFrameRateEvent
|
参数:end+输入参数
|
StartCaptureAppFramerate事件
|
MonkeyGetAppFrameRateEvent
|
参数:start+app
|
EndCaptureAppFramerate事件
|
MonkeyGetAppFrameRateEvent
|
参数:end+app+label
|
2.3 一点思考
原生的Monkey虽然功能已经很强大,但依然存在一些不足,比如:
- 有些动作是基于像素位置的,对不同设备测试不友好
- 测试不可控,比如你想摸你用户测一连串操作,monkey值停留在登陆页一直登陆。(跑一晚上白跑了个寂寞)
- 不支持截图等保存现场的功能
- 不支持实时捕获异常,需要肉眼爬日志找问题
改进的思考点:
- 将基于像素,改为基于像素相对位置,以适配不同的设备
- 支持关键路径配置,可有针对性的测试
- 脚本模块化,复用和组合,快速构建测试脚本
- 增加基于控件的功能,能够识别控件,并判断下一步操作
- 控件去重,防止无效测试
- 根据堆栈异常信息,发邮件给开发,快速定位问题。
技术牛逼,技术就是让人无脑操作。 --- me
这是水木竹水的博客