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功能

以下内容根据源码解读。

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

 

posted @ 2022-05-25 11:40  水木竹水  阅读(1050)  评论(0编辑  收藏  举报