MonkeyScript的简单使用
一、 什么是MonkeyScript
MS 是官方提供的,除了像猴子一样随机乱点之外,还可以通过编写脚本的形式,完成一系列固定的操作。MS 提供一整套完善的 API 来进行支持,主要还是基于坐标点的操作,包含常用的:点击、长按、输入、等待等操作。
二、 MonkeyScript的使用
- 编写MonkeyScript的测试脚本。
MS脚本只要是文本即可,不关心后缀是什么,所以编写时不要添加后缀,保存文本格式即可。
MS 脚本虽然有一些指定的 API ,但是也有一些固定的脚本头,需要写在脚本的最前面。
type=user
count = 1
speed = 1.0
start data >>
在脚本中,脚本头是一直不变动的,为了避免写错,可以直接复制粘贴最保险。在 start data>> 之后就可以正式开始编写 monkey 脚本了,在脚本中,使用 #
号,对单行进行注释。
MonkeyScript是需要指定Activity(当前app展示的界面)的,获取当前指定界面Activity名称的指令为adb shell dumpsys activity | grep mFocused。
下面以测试登录功能为例:
LaunchActivity(Activity)
UserWait(1000)
DispatchPointer(0,0,0,303,312,0,0,0,0,0,0,0)
DispatchPointer(0,0,1,303,312,0,0,0,0,0,0,0)
UserWait(1000)
DispatchString(1234566)
UserWait(100)
//输入密码
DispatchPointer(0,0,0,345,393,0,0,0,0,0,0,0)
DispatchPointer(0,0,1,345,393,0,0,0,0,0,0,0)
UserWait(100)
DispatchString(1234567)
UserWait(1000)
//点击空白处让键盘消失
DispatchPointer(0,0,0,100,100,0,0,0,0,0,0,0)
DispatchPointer(0,0,1,100,100,0,0,0,0,0,0,0)
UserWait(1000)
//点击登录按钮
DispatchPointer(0,0,0,361,507,0,0,0,0,0,0,0)
DispatchPointer(0,0,1,361,507,0,0,0,0,0,0,0)
UserWait(3000)
脚本解释:
首先启动你要测试的界面,此处为登录界面,登录界面有三个控件,用户名的textField,密码的textField,和登录按钮。
LaunchActivity()
作用为来到登录界面
UserWait(1000)
等待1秒以后执行下一个操作
DispatchPointer(0,0,0,303,312,0,0,0,0,0,0,0)
DispatchPointer(0,0,1,303,312,0,0,0,0,0,0,0)
DispatchPointer点击用户名的textField,只需关注3,4,5这三个参数即可,第三个参数为0表示点击了textField ,为1表示松开了textField,4,5两个参数分别为用户名textField 的x,y坐标。
DispatchString(123456)
在用户名的textField中输入123456用户名
按照上面的操作在密码的textField输入密码,点击登录按钮,整改登录测试就完成了,如果需要继续测试登录后的界面则需要从新启动新的Activity。
//登录成功后来到首页点击发布作业功能(具体什么功能和第4,5个参数设置的值有关)
LaunchActivity(Activity)
UserWait(1000)
DispatchPointer(0,0,0,650,182,0,0,0,0,0,0,0)
DispatchPointer(0,0,1,650,182,0,0,0,0,0,0,0)
UserWait(1000)
Drag(500,1500,500,500,12)
#向上滑动
将写好的脚本保存到本地。
2. Monkey 启动 MonkeyScript 的命令如下:
adb shell monkey -f <MonkeyScript> <EventCount>
<MonkeyScript>指你编写的MonkeyScript脚本,
<EventCount>指Monkey事件,例如执行次数,日志详情等。
具体指令:
- adb shell mkdir /sdcard/script 在设备上创建script文件夹用于存放脚本
- 将本地脚本文件push到设备中上面创建的文件夹中。例如adb push /Users/userName/Desktop/testLogin空格/sdcard/script,/Users/userName/Desktop/testLogin就是你脚本在本地的存放路径。
- 执行adb shell monkey -f /sdcard/script/你的脚本名称 –v –v 10 >C:monkey.txt即可,>C:monkey.txt为日志输出路径。
其他简介
LaunchActivity(pkg_name, cl_name):启动应用的Activity。参数:包名和启动的Activity。
Tap(x, y, tapDuration): 模拟一次手指单击事件。参数:x,y为控件坐标,tapDuration为点击的持续时间,此参数可省略。
DispatchPress(keyName): 按键。参数: keycode。 详细的Android Keycode列表: http://blog.csdn.net/feizhixuan46789/article/details/16801429
RotateScreen(rotationDegree, persist): 旋转屏幕。 参数:rotationDegree为旋转角度, e.g. 1代表90度;persist表示旋转之后是否固定,0表示旋转后恢复,非0则表示固定不变。
DispatchFlip(true/false): 打开或者关闭软键盘。
LongPress(): 长按2秒。
PressAndHold(x, y, pressDuration): 模拟长按事件。
DispatchString(input): 输入字符串。
Drag(xStart, yStart, xEnd, yEnd, stepCount): 用于模拟一个拖拽操作。
PinchZoom(x1Start, y1Start, x1End, y1End, x2Start, y2Start, x2End, y2End, stepCount): 模拟缩放手势。
UserWait(sleepTime): 休眠一段时间
DeviceWakeUp(): 唤醒屏幕。
PowerLog(power_log_type, test_case_status): 模拟电池电量信息。
WriteLog(): 将电池信息写入sd卡。
RunCmd(cmd): 运行shell命令。
DispatchPointer(downtime,eventTime,action,x,yxpressure,size,metastate,xPrecision,yPrecision,device,edgeFlags): 向指定位置,发送单个手势。
DispatchPointer(downtime,eventTime,action,x,yxpressure,size,metastate,xPrecision,yPrecision,device,edgeFilags): 发送按键消息。
LaunchInstrumentation(test_name,runner_name): 运行一个instrumentation测试用例。
DispatchTrackball: 模拟发送轨迹球事件。
ProfileWait: 等待5秒。
StartCaptureFramerate(): 获取帧率。
EndCaptureFramerate(input): 结束获取帧率。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
作为移动端测试必须掌握的初级Android稳定性工具:monkey,提到它时,脑海里一般涌现出两句话:
1.我会用,很简单
就是一行命令,一回车就开始跑起来了
2.使用问题多,不好用
太随机,很多操作没意义
达到深层页面的概率极低
虽然加了各种忽略异常,但是monkey进程还是经常死掉
无法有针对性(指定页面or指定操作)的测试 ,等等
带着这些问题,将更智能的monkey介绍给大家
智能monkey之monkeyscript(一)
解决问题:
有针对性的指定操作进行稳定性测试
需求(参考搜狗搜索APP):
启动app,搜索1次,退出。重复1万次
Script:
type=user
count=10
speed=1.0
start data >>
LaunchActivity(com.sogou.activity.src, com.sogou.search.entry.EntryActivity)
UserWait(3000)
captureDispatchPointer(10,10,0,500,500,1,1,-1,1,1,0,0)
captureDispatchPointer(10,10,1,500,500,1,1,-1,1,1,0,0)
UserWait(500)
captureDispatchString(test)
UserWait(500)
captureDispatchPress(66)
UserWait(3000)
Drag(500,1500,500,500,500)
captureDispatchPress(4)
UserWait(1000)
captureDispatchPress(4)
captureDispatchPress(4)
script逐行解释:
type=user
count=10
speed=1.0
start data >>
#固定头部,参数和值均不影响脚本
LaunchActivity(com.sogou.activity.src, com.sogou.search.entry.EntryActivity)
#启动app,参数1:包名,参数2:主activity名
UserWait(1500)
#等待1500毫秒
captureDispatchPointer(10,10,0,500,500,1,1,-1,1,1,0,0)
#按下坐标500,500(搜索框位置)
captureDispatchPointer(10,10,1,500,500,1,1,-1,1,1,0,0)
#抬起坐标500,500(搜索框位置)
UserWait(500)
#等待500毫秒
captureDispatchString(test)
#在搜索框输入“test”
captureDispatchPress(66)
#输入回车进行搜索
UserWait(3000)
#等待3000毫秒
Drag(500,1500,500,500,500)
#上划浏览搜索结果页
captureDispatchPress(4)
#输入back回退至app首页
UserWait(500)
等待500毫秒
captureDispatchPress(4)
captureDispatchPress(4)
#双back退出app
运行:
1.将脚本保存命名(例test_search)
2.将脚本文件放置测试机中
adb shell mkdir /sdcard/script
#创建脚本文件夹
adb push test_search /sdcard/script
#将脚本文件push到文件夹
3.运行脚本文件1万次
adb shell monkey -f /sdcard/script/test_search 10000
运行效果:
附件1
Monkeyscript API介绍
#单点事件
DispatchPointer(downTime,eventTime,action,x,y,pressure,size,metaStat,xPrecision,yPrecision,device,edgeFlags)
downTime,//touchdown的时间
eventTime,//touch时间发生的时间
action,//Action code: either {@link #ACTION_DOWN=0}, {@link #ACTION_UP=1}, or {@link #ACTION_MULTIPLE=2}. 如果时间是0,2,1可以模拟滑屏
x, //The X coordinate of this event.
y, //The Y coordinate of this event.
pressure, //The current pressure of this event. The pressure generally ranges from 0 (no pressure at all) to 1 (normal pressure), however values higher than 1 may be generated depending on the calibration of the input device.
size, //A scaled value of the approximate size of the area being pressed touched with the finger. The actual value in pixels corresponding to the finger touch is normalized with a device specific range of values and scaled to a value between 0 and 1.
metaStatex //The state of any meta / modifier keys that were in effect when the event was generated.
xPrecision, //The precision of the X coordinate being reported.
yPrecision, //The precision of the Y coordinate being reported.
deviceId, //The id for the device that this event came from. An id of zero indicates that the event didn't come from a physical device; other numbers are arbitrary and you shouldn't depend on the values.
edgeFlags, // A bitfield indicating which edges, if any, where touched by this MotionEvent
example:
DispatchPointer(0,0,0,830,1000,0,0,0,0,0,0,0); touchDown
DispatchPointer(0,0,1,830,1000,0,0,0,0,0,0,0);touchUp
#拖动
Drag(x1,y1,x2,y2,stepCount)
example:
快速下滑:Drag(300,500,300,300,15)
快速上滑:Drag(300,300,300,500,15)
#双指缩放
PinchZoom(xstart1,ystart1,xstart2,ystart2,xend2,yend2,xend1,yend1,step)
example:
#放大
PinchZoom(400,400,200,300,550,550,700,700,3);
#cmd: shell命令
RunCmd(cmd)
example
RunCmd(monkey -v 1000)
#发送tap事件(一个touchdown和touch up事件),时间长可以模拟长按,时间单位为ms
Tap(x,y,tapDuration)
#启动唤醒设备
DeviceWakeUp()
#获取最后一个touch时间的点做长按
LongPress()
#按住duration时长
PressAndHold(x,y,duration)
#屏幕旋转
RotateScreen(rotationDegree,persist)
// rotationDegree只能支持0,90,180,270
// persist 0/1
// 对指定keycode模拟touch事件(keycode列表见尾部)
DispatchKey(downTime,eventTime,action,code,repeat,metaState,device,scancode)
// 对指定keycode模拟press事件
DispatchPress(KeyCode)
KEYCODE列表
电话键
键名 | 描述 | 键值 |
---|---|---|
KEYCODE_CALL | 拨号键 | 5 |
KEYCODE_ENDCALL | 挂机键 | 6 |
KEYCODE_HOME | 按键Home | 3 |
KEYCODE_MENU | 菜单键 | 82 |
KEYCODE_BACK | 返回键 | 4 |
KEYCODE_SEARCH | 搜索键 | 84 |
KEYCODE_CAMERA | 拍照键 | 27 |
KEYCODE_FOCUS | 拍照对焦键 | 80 |
KEYCODE_POWER | 电源键 | 26 |
KEYCODE_NOTIFICATION | 通知键 | 83 |
KEYCODE_MUTE | 话筒静音键 | 91 |
KEYCODE_VOLUME_MUTE | 扬声器静音键 | 164 |
KEYCODE_VOLUME_UP | 音量增加键 | 24 |
KEYCODE_VOLUME_DOWN | 音量减小键 | 25 |
控制键
键名 | 描述 | 键值 |
---|---|---|
KEYCODE_ENTER | 回车键 | 66 |
KEYCODE_ESCAPE | ESC键 | 111 |
KEYCODE_DPAD_CENTER | 导航键 确定键 | 23 |
KEYCODE_DPAD_UP | 导航键 向上 | 19 |
KEYCODE_DPAD_DOWN | 导航键 向下 | 20 |
KEYCODE_DPAD_LEFT | 导航键 向左 | 21 |
KEYCODE_DPAD_RIGHT | 导航键 向右 | 22 |
KEYCODE_MOVE_HOME | 光标移动到开始键 | 122 |
KEYCODE_MOVE_END | 光标移动到末尾键 | 123 |
KEYCODE_PAGE_UP | 向上翻页键 | 92 |
KEYCODE_PAGE_DOWN | 向下翻页键 | 93 |
KEYCODE_DEL | 退格键 | 67 |
KEYCODE_FORWARD_DEL | 删除键 | 112 |
KEYCODE_INSERT | 插入键 | 124 |
KEYCODE_TAB | Tab键 | 61 |
KEYCODE_NUM_LOCK | 小键盘锁 | 143 |
KEYCODE_CAPS_LOCK | 大写锁定键 | 115 |
KEYCODE_BREAK | Break/Pause键 | 121 |
KEYCODE_SCROLL_LOCK | 滚动锁定键 | 116 |
KEYCODE_ZOOM_IN | 放大键 | 168 |
KEYCODE_ZOOM_OUT | 缩小键 | 169 |