您的位置:首页 > 其它

老李推荐:第6章5节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-事件

2016-01-04 16:52 295 查看

老李推荐:第6章5节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-事件

从网络过来的命令字串需要解析翻译出来,有些命令会在翻译好后直接执行然后返回,但有一大部分命令在翻译后需要转换成对应的事件,然后放入到命令队列里面等待执行。Monkey在取出一个事件执行的时候主要是执行其injectEvent方法来注入事件,而注入事件根据是否需要往系统注入事件分为两种:需要通过系统服务往系统注入事件:如MonkeyKeyEvent事件会通过系统的InputManager往系统窗口注入按键事件来完成输入请求

不需要通过系统服务往系统注入事件: 如MonkeyWaitEvent只是进行简单的睡眠等待

MonkeyEvent是所有Monkey事件的总称,其实它包含了多种事件,我们先看下类图:

图6-5-1 MonkeyEvent类族谱大家可以看到MonkeyEvent是一个抽象类,它最重要的地方是定义了injectEvent这个抽象方法。然后有一系列的子类继承该抽象类来实现其injectEvent接口,也就是去实现如何往系统注入事件来完成MonkeyRunner的请求了。所以如果这里要给Monkey事件做一个定义,我认为可以这样定义:Monkey事件是一个实现了injectEvent方法来处理不同的命令请求的类。但这里我们要注意并不是所有从MonkeyRunner过来的命令字串都会生成对应的事件的,请看下表:
命令字串命令翻译类目标事件类MR是否支持注释
touch down x yTouchCommandMonkeyTouchEventx代表x坐标,y代表y坐标
touch up x yTouchCommandMonkeyTouchEvent同上
touch move x yTouchCommandMonkeyTouchEvent同上
tap x yTapCommandMonkeyTouchEvent同上
press namePressCommandMonkeyKeyEventName代表按键名,如"MENU", "HOME", "SEARCH"等
key down nameKeyCommandMonkeyKeyEvent同上
key up nameKeyCommandMonkeyKeyEvent同上
getvar nameGetVarCommandN/A(不会有对应事件,所以也不会加入事件队列,而是直接取得属性返回)name 代表属性名
listvar ListViewsCommand同上
type lineTypeCommandMonkeyKeyEventline 代表输入字串
wakeWakeCommandN/A(不会有对应事件,所以也不会加入事件队列,而是直接PowerManager唤醒屏幕)
listViewsListViewsCommandN/A(不会生成事件也不会入事件队列)
queryviewQueryViewCommandN/A(不会生成事件也不会入事件队列)
getRootViewGetRootViewCommandN/A(不会生成事件也不会入事件队列)
getViewWithTextGetViewsWithTextCommandN/A(不会生成事件也不会入事件队列)
doneN/AN/A(不会生成事件也不会入事件队列)测试完成,Monkey收到命令后会停止Socket监听
quitN/AN/A(不会生成事件也不会入事件队列)测试请求退出,Monkey收到后不会停止Socket监听,
flip openMonkeyFlipEventMonkeyFlipEventMonkeyRunner不支持发送这两个命令
flip closeMonkeyFlipEventMonkeyFlipEvent
trackball dx dy
deferredReturnDeferReturnCommandN/A(不会生成事件也不会入事件队列)这个命令比较特别,做的事情是等待一个命令完成然后执行另外一个命令。但是在MonkeyRunner框架中并没有支持。
注: MR代表MonkeyRunner
表6-5-1 命令字串 – 命令翻译类 – 事件关系参照表从列表中我们可以看到MonkeySourceNetwork支持大部分从MonkeyRunner过来的命令字串,但是只有2种是会生成对应的事件并存放到事件队列里面的,这两种事件都是需要对界面进行操作的,而其他如获得系统属性以及获得界面控件等命令都是不会生成对应事件,也不会进入到事件队列,而是直接处理然后返回的。这里我们对这2种事件做相应的描述:MonkeyTouchEvent:对界面进行触屏操作,最终会通过InputManager往系统注入对应事件

MonkeyKeyEvent: 往界面输入键值,最终会通过InputManager往系统注入对应事件

这里要注意的是,其实并不是所有的事件注入都需要真的往系统窗口注入事件的,这个接口方法的名字我觉得Google 工程师起得不好,比如叫做handleEvent就不会造成混乱了(个人见解)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  软件测试开发