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. 【ASP.NET】判断访问网站的客户端是PC还是手机

    原文:[ASP.NET]判断访问网站的客户端是PC还是手机 主要就是通过客户端传递的User-agent来判断访问网站的客户端是PC还是手机,.NET中就是Request.ServerVariable ...

  2. C#开发中使用配置文件

    C#开发中使用配置文件对象简化配置的本地保存 0x00 起因 程序的核心是数据和逻辑,开发过程中免不了要对操作的数据进行设置,而有些数据在程序执行过程中被用户或程序做出的修改是应该保存下来的,这样程序 ...

  3. InstallShield自定义安装界面

    原文:InstallShield自定义安装界面 版权声明: 可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息. 前言: 对于一些InstallShield用户或企业,对于安装包界面除了 ...

  4. Visual FoxPro 6.0~9.0解决方案和实例文档和CD写入原件下载

    自从微软宣布开发冻结Visual FoxPro之后,这样的图书出版已经成为一个问题,但仍有不少VFP小贴士.处处留心此8历史书.在此提供写作的原稿.它看起来非常舒服比扫描版淘宝.下载链接:http:/ ...

  5. cocos2d-x 网络请求

    [cocos2dx]rapidjson用法以及中文显示的解决方法 cocos2dx 读取json及解析 cocos2dx rapidjson 高速解析JSON  --- [cocos2d-x官方文档] ...

  6. OpenWrt arp 命令发布

    arp命令是用来查看mac与ip在消息路由器缓存表.这是一个基本的介绍了一下我就不说了. 但今天我的同事通过arp.可是在shell脚本就回显示没有此命令,我当时也感到非常费解. 于是乎.做了例如以下 ...

  7. 朴素贝叶斯算法(Naive Bayes)

    朴素贝叶斯算法(Naive Bayes) 阅读目录 一.病人分类的例子 二.朴素贝叶斯分类器的公式 三.账号分类的例子 四.性别分类的例子 生活中很多场合需要用到分类,比如新闻分类.病人分类等等. 本 ...

  8. java线 生产者和消费者

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGlhbmdydWkxOTg4/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...

  9. 利用css新属性appearance优化select下拉框

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  10. Java高效编程(2) -- Creating and Destroying Objects

    Item 1: Consider static factory methods instead of constructors Advantage: One advantage of static f ...