MonkeyScript

MonkeyScript的简单使用

一、 什么是MonkeyScript

MS 是官方提供的,除了像猴子一样随机乱点之外,还可以通过编写脚本的形式,完成一系列固定的操作。MS 提供一整套完善的 API 来进行支持,主要还是基于坐标点的操作,包含常用的:点击、长按、输入、等待等操作。

 

二、 MonkeyScript的使用

  1. 编写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事件,例如执行次数,日志详情等。

 

具体指令:

  1. adb shell mkdir /sdcard/script 在设备上创建script文件夹用于存放脚本
  2. 将本地脚本文件push到设备中上面创建的文件夹中。例如adb push /Users/userName/Desktop/testLogin空格/sdcard/script,/Users/userName/Desktop/testLogin就是你脚本在本地的存放路径。
  3. 执行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按键Home3
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_ESCAPEESC键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_TABTab键61
KEYCODE_NUM_LOCK小键盘锁143
KEYCODE_CAPS_LOCK大写锁定键115
KEYCODE_BREAKBreak/Pause键121
KEYCODE_SCROLL_LOCK滚动锁定键116
KEYCODE_ZOOM_IN放大键168
KEYCODE_ZOOM_OUT缩小键169

转载于:https://www.cnblogs.com/georgexu/p/11223965.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值