《MonkeyRunner原理剖析》第九章-MonkeyImage实现原理 - 第一节 - 关键类作用及关系
MonkeyRunner框架暴露了几个类的大量的API出去给用户编写脚本时候使用,其中最主要的三个就是: MonkeyDevice目标设备操作类,HierarchyViewer窗口界面对象操作类以及MonkeyImage这个截屏处理类。了解了这3个类以及跟他们相关的关键类的实现原理,基本上可以说MonkeyRunner框架的实现原理就算搞清楚了。因为一个UI自动化测试框架的关键功能无非就是这三样: 操作目标设备,如注射点击事件等;获取控件信息,如获取需要点击的控件的中心坐标等;结果比较。其实这3个类也就是我们往下章节分析的重点。
操作目标设备和获取控件信息的重要性我们很容易理解,但是截屏处理为什么也这么重要呢?这是因为MonkeyRunner没有集成如Junit等单元测试框架,它也并不完全是一个如UiAutomator,Robotium或者Appium等的面向控件的自动化测试框架,所以它的执行结果比较的功能主要就是通过比较截屏和预期结果是否是一致的来判断我们的测试用例是否应该通过的。
所以本章我们先去分析的就是MonkeyImage这个类。在MonkeyRunner框架中,主要用到的库除了自身monkeyrunner这个库之外,还会经常用到chimpchat和ddmlib这两个库,这个我们在上一章已经见识过了。下面我们就先看下MonkeyImage相关类的类图,然后做简要的描述,之后会在本章独立的章节对关键的类进行相应的分析和阐述。

图9-1-1 MonkeyImage关键类关系图
- MonkeyRunner: MonkeyRunner这个类在这里的主要作用是它提供了loadImageFromFile给用户在编写脚本时调用。该方法的目的是调用依赖的ChimpImageBase抽象类的静态方法loadImageFromFile去指定的路径把一个文件读取出来并事例化成BufferedImage对象,比如把之前保存好的作为预期结果的截屏文件读出来,然后再去跟通过调用MonkeyDevice的getSnapshot方法获得的截屏进行比较以确定该界面是否有变化
- MonkeyImage: 类似于MonkeyDevice提供了用户操作目标安卓设备的接口,MonkeyImage类提供了用户处理图片的接口方法。要注意的是真正去截屏的操作还是需要调用MonkeyDevice的takeSnapshot方法去完成的,因为MonkeyImage并不会提供与设备交互的功能,它只提供图片处理的功能。这里要注意的是MonkeyImage的成员变量IChimpImage类型的impl,IChimpImage是个接口,AdbChimpImage类是该接口的实现类,在用户调用MonkeyDevice的takeSnapshot方法来获取一个截屏的过程中,MonkeyDevice会根据获得的截屏裸图RawImage来构建一个AdbChimpImage的实例,然后将该实例赋予给MonkeyImage的impl成员变量来构建一个MonkeyImage的实例。MonkeyDevice获取截屏的原理分析会在第9章进行详细分析,这里大家只需要指导impl指的就是AdbChimpImage的一个实例就行了
- AdbChimpImage: MonkeyImage对图片的处理会通过请求其聚合的AdbChimpImage的实例来完成。比如用户在脚本调用MonkeyImage的sameAs方法来比较两个截屏是否是一样的时候,MonkeyImage就会调用AdbChimpImage对应的sameAs来进行比较处理,而AdbChimpImage其实并没有去实现sameAs这个方法,该方法真正的实现是在AdbChimpImage的父类ChimpImageBase中实现的。AdbChimpImage持有了一个RawImage裸图的对象,该对象是在用户调用MonkeyDevice的takeSnapshot的过程中构建的。至于RawImage裸图的详细分析,本章和面会又相应的小节专门进行分析
- RawImage: 代表一个裸图的类,是根据”framebuffer:”这个 ADB截屏服务返回来的截屏数据创建的, 该类由ddmlib库提供。下一小节会对framebuffer这个ADB截屏服务进行详细的分析
- ChimpImageBase: AdbChimpImage的父类主要的图片处理方法都在这个类中实现,比如上面提到的sameAs这个图片比较方法,以及其他如getSubImage获取子图的方法等。但需要注意的是该类对图片的处理使用的图片类是BufferedImage这个由Java的AWT库提供的通用类,而非ddmlib提供的RawImage这个安卓专用的裸图类。ChimpImageBase同时也是IChimpImage接口的实现类,该接口定义了一些子类必须实现的图片处理的方法,比如刚才提到的sameAs和getSubImage
- BufferedImageChimpImage: ChimpImageBase的子类除了有AdbChimpImage这个专门用来处理MonkeyDevice的takeSnapshot返回来的截屏裸图RawImage的类之外,还有一个叫做BufferedImageChimpImage的子类,它是作为ChimpImageBase的内部类来实现的。它跟AdbChimpImage类在整个类关系图中处于同一个水平,相对AdbChimpImage是用来处理takeSnapshot返回的截屏,BufferedImageChimpImage类更多是用来处理从文件中加载的图片和getSubImage获取到的子图图片。它拥有的通用类BufferedImage的实例image会让这些处理更加简单快捷
- IChimpImage: ChimpChat库的图片处理接口,定义了子类需要实现的最基本的图片处理方法
《MonkeyRunner原理剖析》第九章-MonkeyImage实现原理 - 第一节 - 关键类作用及关系的更多相关文章
- 第九章 Servlet工作原理解析
9.1 从Servlet容器说起 Servlet容器:Jetty, Tomcat等. 这里以Tomcat为例, 真正管理Servlet的容器是Context容器,一个Context对应一个WE ...
- 第九章 Servlet工作原理解析(待续)
从 Servlet容器说起 创建 Servlet实例 Servlet体系结构 Servlet如何工作 Servlet中的Listener Filter如何工作 Servlet中的url-pattern
- 第8章2节《MonkeyRunner源代码剖析》MonkeyRunner启动执行过程-解析处理命令行參数
MonkeyRunnerStarter是MonkeyRunner启动时的入口类,由于它里面包括了main方法.它的整个启动过程主要做了以下几件事情: 解析用户启动MonkeyRunner时从命令行传输 ...
- CSS3秘笈复习:第九章&第十章
第九章 1.和链接有关的伪类: (1):link,未访问过的链接 (2):visited,已访问过的链接 (3):hover,鼠标悬停链接 (4):active,单击链接时 这四种方式一定要严格按上面 ...
- 第6章1节《MonkeyRunner源代码剖析》Monkey原理分析-事件源-事件源概览
在上一章中我们有简要的介绍了事件源是怎么一回事.可是并没有进行详细的描写叙述.那么往下的这几个小节我们就须要把这方面的知识给补充完整. 这一节我们先主要环绕MonkeySourceNetwork这个事 ...
- 【机器学习实战 第九章】树回归 CART算法的原理与实现 - python3
本文来自<机器学习实战>(Peter Harrington)第九章"树回归"部分,代码使用python3.5,并在jupyter notebook环境中测试通过,推荐c ...
- Servlet工作原理解析 《深入分析java web 技术内幕》第九章
参考关于servblet的相关文章 侧重概况:https://blog.csdn.net/levycc/article/details/50728921 ibm的相关:https://www.ibm. ...
- iPhone/Mac Objective-C内存管理教程和原理剖析
http://www.cocoachina.com/bbs/read.php?tid-15963.html 版权声明 此文版权归作者Vince Yuan (vince.yuan#gmail.com)所 ...
- 写给 Android 应用工程师的 Binder 原理剖析
写给 Android 应用工程师的 Binder 原理剖析 一. 前言 这篇文章我酝酿了很久,参考了很多资料,读了很多源码,却依旧不敢下笔.生怕自己理解上还有偏差,对大家造成误解,贻笑大方.又怕自己理 ...
随机推荐
- Spring MVC框架搭建
Spring MVC篇一.搭建Spring MVC框架 本项目旨在搭建一个简单的Spring MVC框架,了解Spring MVC的基础配置等内容. 一.项目结构 本项目使用idea intellij ...
- html5中关于input使用方法的改变
測试环境:Firefox 10.0.Safari 5.1.Opera 11.61, Chrome 14.0.835.202 自己測试的时候都有写在form表单里,有提交button验证.由于对博客使用 ...
- css Tab选项卡2
注意上述 红色方框 这个是锚点的变相 以及overflow:hiden结合, 利用 锚点对应 id , 也可以实现. 兼容ie6+ 适合手机tab 简单 不需要脚本 其实还可以利用 ...
- Vivado的helloword计划(一个):硬件project部分
硬件平台:ZedBoard 软件平台:vivado2013.3 本演示样例通过综合.实现,生成比特流,发送到SDK实现. 启动vivado而且创建一个项目 依据提示操作一步步创建新项目的时候记得选择R ...
- JS封深入了解
1. javascript 语言理解闭包 js变量的范围分成两个:全局变量.局部变量.在全局变量的函数外声明变量,内部功能可以直接调用全局变量.声明变量里面的函数必须使用var 命令,否则,它里面的函 ...
- Scan IP relocate/failover其它段后不能ping通过
或手动集群重启单个节点srvctl relocate scan_listener后.群集网络段ping IP,VIP.SCAN IP正常.其他段ping SCAN IP 不通.其原因是,该路由ARP表 ...
- spring交易声明的几个传播特性
近期遇到了一个spring事务导致的问题,所以写了几个小程序了解了一下事务的传播特性,以下分别举样例分别看看事务的传播特性. 事务的几种传播特性 1. PROPAGATION_REQUIRED: 假设 ...
- hdu4758 Walk Through Squares 自动机+DP
题意:给n*m的地图,在地图的点上走,(n+1)*(m+1)个点,两种操作:往下走D和往右走R.现在要从左上角走到右下角,给定两个操作串,问包含这两个串的走法总共有多少种. 做法:用这两个串构建自动机 ...
- How to install IIS 7.5 on Windows 7 using the Command Line
原文 How to install IIS 7.5 on Windows 7 using the Command Line On Windows Vista, to install IIS 7.0 f ...
- zzu--2014年11月16日月潭赛 C称号
1230: Magnets Time Limit: 1 Sec Memory Limit: 128 MB Submit: 24 Solved: 13 [id=1230" style=&q ...