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实现原理 - 第一节 - 关键类作用及关系的更多相关文章

  1. 第九章 Servlet工作原理解析

    9.1 从Servlet容器说起    Servlet容器:Jetty, Tomcat等. 这里以Tomcat为例,  真正管理Servlet的容器是Context容器,一个Context对应一个WE ...

  2. 第九章 Servlet工作原理解析(待续)

    从 Servlet容器说起 创建 Servlet实例 Servlet体系结构 Servlet如何工作 Servlet中的Listener Filter如何工作 Servlet中的url-pattern

  3. 第8章2节《MonkeyRunner源代码剖析》MonkeyRunner启动执行过程-解析处理命令行參数

    MonkeyRunnerStarter是MonkeyRunner启动时的入口类,由于它里面包括了main方法.它的整个启动过程主要做了以下几件事情: 解析用户启动MonkeyRunner时从命令行传输 ...

  4. CSS3秘笈复习:第九章&第十章

    第九章 1.和链接有关的伪类: (1):link,未访问过的链接 (2):visited,已访问过的链接 (3):hover,鼠标悬停链接 (4):active,单击链接时 这四种方式一定要严格按上面 ...

  5. 第6章1节《MonkeyRunner源代码剖析》Monkey原理分析-事件源-事件源概览

    在上一章中我们有简要的介绍了事件源是怎么一回事.可是并没有进行详细的描写叙述.那么往下的这几个小节我们就须要把这方面的知识给补充完整. 这一节我们先主要环绕MonkeySourceNetwork这个事 ...

  6. 【机器学习实战 第九章】树回归 CART算法的原理与实现 - python3

    本文来自<机器学习实战>(Peter Harrington)第九章"树回归"部分,代码使用python3.5,并在jupyter notebook环境中测试通过,推荐c ...

  7. Servlet工作原理解析 《深入分析java web 技术内幕》第九章

    参考关于servblet的相关文章 侧重概况:https://blog.csdn.net/levycc/article/details/50728921 ibm的相关:https://www.ibm. ...

  8. iPhone/Mac Objective-C内存管理教程和原理剖析

    http://www.cocoachina.com/bbs/read.php?tid-15963.html 版权声明 此文版权归作者Vince Yuan (vince.yuan#gmail.com)所 ...

  9. 写给 Android 应用工程师的 Binder 原理剖析

    写给 Android 应用工程师的 Binder 原理剖析 一. 前言 这篇文章我酝酿了很久,参考了很多资料,读了很多源码,却依旧不敢下笔.生怕自己理解上还有偏差,对大家造成误解,贻笑大方.又怕自己理 ...

随机推荐

  1. 简单vector达到

    得知c++于,看完这本书后,,最近苦于不知道下一步该怎么做了,在寻找STL在各种容器的源代码分析,我想一次又一次地实现它. 之前,很多问题看的时候不知道是怎么回事,意与理解的.这个vector类写得特 ...

  2. 【Stackoverflow好问题】祛烦“!=null&quot;()判处空语句

    问题 为了避免空指针调用,我们常常会看到这种语句 ...if (someobject != null) { someobject.doCalc();}... 终于.项目中会存在大量判空代码.多么丑陋繁 ...

  3. 使用jprobe建设镜面层叠的原则和见解

    忽然想起的回忆,那是2007上周五在冬季,我看我的老湿调试Linux堆IP层,只看到他改变路由查找的逻辑,然后直接make install上的立竿见影的效果有点,我只知道,,这种逻辑必须再次更改编译内 ...

  4. XCL-Charts画一个图(CurveChart)

    情节线图与往常不同的是,它是一个比较特殊线位置计算.所以我得到一个单独的类.相同.只需要输入数据源的基类, 加,控制要添加的.你可以画出你自己主动设置按照预期的效果. 代码: //图基类 chart ...

  5. 三种字符编码:ASCII、Unicode和UTF-8

    原文:三种字符编码:ASCII.Unicode和UTF-8 什么是字符编码? 计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用8个比特(bit)作为一个字 ...

  6. struts2-dojo-plugin-2.3.1.2.jar!/struts-plugin.xml:29:119

    Unable to load configuration. - bean - jar:file:/D:/code_workspace/SSHWorkSpace3/.metadata/.plugins/ ...

  7. 创意HTML5文字特效 类似翻页的效果

    原文:创意HTML5文字特效 类似翻页的效果 之前在网上看到一款比较有新意的HTML5文字特效,文字效果是当鼠标滑过是出现翻开折叠的效果,类似书本翻页.于是我兴致勃勃的点开源码看了一下,发现其实实现也 ...

  8. 一个sql的优化

    原文:一个sql的优化 目的:为了查询某天某个服务器上的登录id的个数   刚开始编写的sql: select count(a.mac) logusers from Log_MacLogin_All ...

  9. C/C++基础笔试题1.1.2(十问解决方案运营商)

    他写在博客上不负责任,有人踩在上面,原因一点点失去了它. 其实纯常见问题.特别糟糕,由于鲍文看起来很大的优势就是想更直接看到的东西. 好了.返回整个标题. 1.你脑海中的运算符有哪些.按优先级排个序? ...

  10. C# .net基于Http实现web server(web服务)

    原文:C# .net基于Http实现web server(web服务) 什么是 web server?  百度百科是这么解释的: Web Server中文名称叫网页服务器或web服务器.WEB服务器也 ...