老李推荐:第6章1节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览 2
- 事件要到那里去?
每个事件源处理类都维护着一个自己的事件队列, 在Monkey中叫做CommandQueue,里面装的是每个具体的MonkeyEvent事件。当来自网络的字串命令被翻译成对应的MonkeyEvent的时候就会把它追加到事件队列里面
了解了以上几个问题,我们脑袋里就有MonkeySourceNetwork这个事件源的基本的概念了,以下简要总结下MonkeySourceNetwork的主要作用:
- 从网络获取命令字串
- 使用相应的命令翻译类把命令字串翻译成MonkeyEvent事件并把事件放入到命令队列CommandQueue
最后放到CommandQueue里面做什么呢?当然是给Monkey类的runMonkeyCycles方法去消费事件了,还记得它每个循环都会调用mEventSource.getNextEvent去获取一个事件然后进行事件注入吧?具体请查看上一章第7节runMonkeyCycles方法的介绍。
下图示例显示了从MonkeyRunner测试脚本调用MonkeyDevice的type方法来往系统窗口输入字串开始,到该type命令字串由网络事件源获取到并翻译成对应的事件,加入事件队列,最后取出事件进行事件注入的流程。其中红色方框圈住部分就是刚才描述的网络事件源类MonkeySourceNetwork主要做的事情。

图6-1-1 事件处理示意图
下面我们看下事件源类的族谱,这里只有我们需要重点描述的MonkeySourceNetwork事件源会把重要的成员方法和成员变量显示出来,但这不代表其他事件源就只有一个getNextEvent方法,只是它们在MonkeyRunner框架中不起什么作用,所以省略了而已:

图6-1-2 事件源族谱
MonkeyEventSource定义了所有事件源的接口,里面定义了所有实现该接口的事件源都必须实现getNextEvent的方法来从各自对应的事件队列CommandQueue中取事件,其实这里CommandQueue更应该叫做EventQueue,这样会更容易理解,因为它里面装的都是事件。这个设计很好的体现了面向对象的多态特性,因为这样的话在上一章描述的runMonkeyCycles方法中就只需要调用MonkeyEventSource接口实例mEventSource的getNextEvent方法就能取得一个事件来执行了,而它根本不需要知道调用的是哪个事件源来获得事件的,因为mEventSource指定的就是所有事件的顶层接口MonkeyEventSource。以下重点描述下跟MonkeyRunner框架相关的事件源:
- MonkeySourceNetworkVars和MonkeySourceNetworkViews并不会直接实现MonkeyEventSource接口,其实它们的事件都是通过MonkeySourceNetwork来从网络获得的,MonkeySourceNetwork在获得网络过来的事件后,如果发现它们是根获取系统属性和获取界面控件有关,那么就会分别调用MonkeySourceNetworkVars和MonkeySourceNetworkViews里面对应的MonkeyCommand内部类的方法translateCommand来把网络过来的字串事件命令翻译成对应的MonkeyEvent
- 这里MonkeySourceNetwork这个事件源是我们分析的重点,它持有成员变量commandQueue,里面装的就是所有将要执行的MonkeyEvent事件
- MonkeySourceNetwork内部建立了一个网络过来的命令字串到对应的MonkeyCommand实例的映射,MonkeyCommand是专门用来将该命令字串翻译成MonkeyEvent事件的
- MonkeySourceNetwork在初始化时会建立一个ServerSocket来接收从网络过来的也就是MonkeyRunner客户端发送过来的字串命令,并调用自身的translateCommand方法来根据该命令名字在分发到其在CommandMap对应的MonkeyCommand来把它翻译成对应的事件
最后我们看下处理网络事件所涉及到的所有关键类的类关系图,先做初步了解以有个初步概念,往下的小节我们将会进行更详细的分析:

图6-1-3 事件处理关键类关系图
根据上一章的分析,Monkey类的runMonkeyCycles方法会循环执行,每循环一次都会调用事件源mEventSource的getNextEvent方法来获得一个事件,在这里就是MonkeySourceNetwork事件源的getNextEvent方法,然后调用该事件的injectEvent方法来处理相应的事件注入请求。那么我们结合上面的关键类关系图看每个类之间的关系及交互是怎么样的:
- Monkey组合MonkeySourceNetwork: Monkey拥有私有成员mEventSource,该成员变量在MonkeyRunner请求”monkey --port 12345”启动monkey的过程中会初始化成MonkeySourceNetwork的实例,详情请看上一章的第6小节”初始化事件源”
- MonkeySourceNetwork组合CommandQueueImpl: MonkeySourceNetwork维护着一个commandQueue的成员变量,这个成员变量是一个保存着所有等待执行的事件的一个队列,也就是我们经常提及的MonkeyEvent事件队列
- CommandQueueImpl组合 MonkeyEvent: 事件队列里边包含有0到多个Monkey事件MonkeyEvent的实例。Monkey的runMonkeyCycles方法里面的每一个cycle都会去该命令队列中取出一条命令来执行
老李推荐:第6章1节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览 2的更多相关文章
- 老李推荐:第14章9节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-遍历控件树查找控件
老李推荐:第14章9节<MonkeyRunner源码剖析> HierarchyViewer实现原理-遍历控件树查找控件 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员 ...
- 老李推荐:第14章5节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-装备ViewServer-查询ViewServer运行状态
老李推荐:第14章5节<MonkeyRunner源码剖析> HierarchyViewer实现原理-装备ViewServer-查询ViewServer运行状态 poptest是国内唯一 ...
- 老李推荐:第14章6节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-装备ViewServer-启动ViewServer
老李推荐:第14章6节<MonkeyRunner源码剖析> HierarchyViewer实现原理-装备ViewServer-启动ViewServer poptest是国内唯一一家培养 ...
- 老李推荐:第14章3节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-HierarchyViewer实例化
老李推荐:第14章3节<MonkeyRunner源码剖析> HierarchyViewer实现原理-HierarchyViewer实例化 poptest是国内唯一一家培养测试开发工程师的培 ...
- 老李推荐: 第14章2节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-HierarchyViewer架构概述
老李推荐: 第14章2节<MonkeyRunner源码剖析> HierarchyViewer实现原理-HierarchyViewer架构概述 HierarchyViewer库的引入让M ...
- 老李推荐:第14章1节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-面向控件编程VS面向坐标编程
老李推荐:第14章1节<MonkeyRunner源码剖析> HierarchyViewer实现原理-面向控件编程VS面向坐标编程 poptest是国内唯一一家培养测试开发工程师的培训机 ...
- 老李推荐:第8章7节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-小结
老李推荐:第8章7节<MonkeyRunner源码剖析>MonkeyRunner启动运行过程-小结 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性 ...
- 老李推荐:第8章5节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-运行测试脚本
老李推荐:第8章5节<MonkeyRunner源码剖析>MonkeyRunner启动运行过程-运行测试脚本 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化 ...
- 老李推荐:第6章8节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-小结
老李推荐:第6章8节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-小结 本章我们重点围绕处理网络过来的命令的MonkeySourceNetwork这个事 ...
- 老李推荐:第8章1节《MonkeyRunner源码剖析》MonkeyRunner启动运行过程-运行环境初始化
老李推荐:第8章1节<MonkeyRunner源码剖析>MonkeyRunner启动运行过程-运行环境初始化 首先大家应该清楚的一点是,MonkeyRunner的运行是牵涉到主机端和目 ...
随机推荐
- Loadrunner 在controller中运行socket脚本时报错:Abnormal termination, caused by mdrv process termination 的原因和解决方法
原因: 网上给出的可能的原因大致有两个: 1. 压力负载机器的资源不足(CPU,内存) 2. 分配内存和释放内存的语句不匹配. 并给出了一些解决方案,最开始我以为是加了IP地址的原因,不断尝试增加 ...
- 利用AForge.NET 调用电脑摄像头进行拍照
当然了,你需要去官网下载类库,http://www.aforgenet.com/ 调用本机摄像头常用的组件: AForge AForge.Controls AForge.Imaging AForge. ...
- Ant学习总结1
一.Ant简介 Ant是用来编译/运行/测试java程序,构建.包装和发布过程中几乎每一件事都可以由Ant的任务来处理. 二.Ant管理项目 当开始一个新的项目时,首先应该编写Ant的构建文件, ...
- js五种设计模式说明与示例
第一种模式:js工厂模式 var lev=function(){ return "啊打"; }; function Parent(){ ...
- Oracle11G卸载教程
用Oracle自带的卸载程序不能从根本上卸载Oracle,从而为下次的安装留下隐患,那么怎么才能完全卸载Oracle呢?那就是直接注册表清除,步骤如下: 1. 开始->设置->控制面板-& ...
- p1154 地平线
题目描述 Farmer John的牛们认为,太阳升起的那一刻是一天中最美好的,在那时她们可以看到远方城市模糊的轮廓.显然,这些轮廓其实是城市里建筑物模糊的影子. 建筑物的影子实在太模糊了,牛们只好把它 ...
- Sleeping会话导致阻塞原理(下)
背景 最近给客户做优化时,有几个客户都存在.SLEEPING 会话中开启了事务,导致的大量阻塞,从而产生严重的性能问题.虽然在之前的文章我分享了Sleeping会话导致阻塞原理(上) .说明了什么是S ...
- 【WCF】错误处理(一):FaultException 与 FaultReason 的搭配
这里所说的错误处理主要是指服务代码中抛出的异常,即开发人员主动抛出的错误当然,由于网络问题或者配置不正确,会引发连接超时的错误,但这里老周要说的是,我们在实现服务逻辑时主动抛出的异常,尤其是对客户端传 ...
- 编程那些事儿:如何快速地"借用"CSS
做前端开发有时候会碰到任务紧急,需要马上写好静态页的问题.比如,设计师给你扔了一个设计稿,要你在下班之前搞定.这时候你如热锅上的蚂蚁,如果自己写css的话,时间紧张,于是上网找了一下相关模板页面,找到 ...
- 【Rsync项目实战】备份全网服务器数据
[Rsync项目实战]备份全网服务器数据 标签(空格分隔): Linux服务搭建-陈思齐 ---本教学笔记是本人学习和工作生涯中的摘记整理而成,此为初稿(尚有诸多不完善之处),为原创作品,允许转载,转 ...