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. 2014 ACM湖南匹配10会议省赛

    2014湖南游戏..... 1:牡丹江Regional有些球队没来的冲突 2:题目比較水 3:队友神勇发挥 最终在开局不利的情况下完毕了翻盘,拿到了第二名.....没有抓住机会顺势夺冠还是非常遗憾的. ...

  2. 高效C++规划

    推荐写C++代码风格.看似easy.坚持不易,且写且珍惜! --陈国林 1. 版本号和版本号声明 版本号和版本号文件声明位于头文件和定义文件的开头,主要内容 (1)版本号信息 (2)文件名.标识符.摘 ...

  3. Java Web系列:Spring Boot 基础 (转)

    Spring Boot 项目(参考1) 提供了一个类似ASP.NET MVC的默认模板一样的标准样板,直接集成了一系列的组件并使用了默认的配置.使用Spring Boot 不会降低学习成本,甚至增加了 ...

  4. 【MySQL案件】ERROR 1418

    1.1.1. ERROR 1418 [环境的叙述性说明] mysql5.0.67 [问题叙述性说明] 当它来到创建存储过程ERROR 1418一个错误. # 创建函数SQL声明 CREATE FUNC ...

  5. cocos2dx 子弹飞作为一个例子来解释解酒效果类CCMotionStreak

    感谢点评与关注,欢迎转载与分享. 勤奋努力,持之以恒! 在游戏开发中,有时会须要在某个游戏对象上的运动轨迹上实现渐隐效果.比方子弹的运动轨迹,假设不借助引擎的帮助.这样的效果则须要通过大量的图片来实现 ...

  6. oracle触发农产品证明文件号码

    CREATE OR REPLACE TRIGGER TRG_KC_SPRK_i     BEFORE INSERT ON KC_SPRK     FOR EACH ROW DECLARE     vS ...

  7. UVA 810 - A Dicey Problem(BFS)

    UVA 810 - A Dicey Problem 题目链接 题意:一个骰子,给你顶面和前面.在一个起点,每次能移动到周围4格,为-1,或顶面和该位置数字一样,那么问题来了,骰子能不能走一圈回到原地, ...

  8. Java的结构之美【1】——构造对象

    当我们遇到多个构造器參数的时候可能会想到用构件器,代码例如以下: /** * 构建器 * @author 阳光小强 * */ public class Lunch { private String c ...

  9. Ubuntu升级后apache所有的失败,以解决虚拟文件夹的设置

    问题描述: 将Ubuntu离12.04升级到14.04后,出现apache配置的虚拟文件夹所有失效.所有站点域名所有定向到根文件夹.无法分别訪问! 尝试方法: 開始以为是升级后Apache的问题.已经 ...

  10. Bind和Eval的区别详解

    原文:Bind和Eval的区别详解 1.简单描述Eval和Bind的区别 绑定表达式 <%# Eval("字段名") %> <%# Bind("字段名& ...