第14章2节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-HierarchyViewer架构概述 2

从上图我们可以看到整个框架其实涉及到了多个库,包括chimpchat,hierarchyviewerlib和ddmlib类,这里先简要描述下主要会用到每个库的哪些类,以及这些类在这里主要的作用是什么,其实很多我们在前面章节都已经接触过了,但以前可能没有去描述这些类跟HierarchyViewer是什么关系。

 

类名

作用

注释

HierarchyViewer

chimpchat

提供控件相关API给测试开发人员调用,如findViewById

拥有ddmlibDevice类的一个实例,所以可以通过该实例来操作AdbHelper来跟ADB服务器进行通信

Device

ddmlib

在这里的主要作用是可以直接调用AdbHelper来往ADB服务器发送命令


AdbHelper

ddmlib

负责连接ADB服务器并向其发送命令


DeviceBridge

hierarchyviewerlib

相当于ViewServer在客户端的代理,两者的关系类似于adbdadb服务器的关系;

组织命令然后调用DeviceConnectionAPI把命令发送给ViewServer

DeviceConnection

hierarchyviewerlib

连接ViewServerSocket客户端,专门用来连接ViewServer,发送命令和接收命令返回


Window

hierarchyviewerlib

代表一个控件的窗口,它跟控件ViewNode是不一样的,它不会保存控件的所有属性,它主要的成员变量有:窗口标题mTitle;代表该窗口的哈希值


ViewNode

hierarchyviewerlib

代表了一个控件,拥有Window实例以及一个控件的所有属性信息


 

表格 11-2-1 HierarchyViewer关键类简述

往下我们描述下每个类之间是怎么互动的:

  • HierarchyViewer依赖DeviceBridge: HierarchyViewer在初始化的时候会调用途中的setupViewServer这个私有方法来准备好目标机器端的ViewServer,期间它会调用DeviceBridge的一系列方法来完成这些事情,其中DeviceBridge是一个静态类,不需要初始化就能直接使用其内部公共方法

  • DeviceBridge依赖DeviceConnection: DeviceBridge成员方法会初始化DeviceConnection对象来通过它把组织好的命令发送到ViewServer,比如DUMP命令.

  • DeviceBridge依赖ViewNode: DeviceBridge在通过发送DUMP命令到ViewServer获得控件列表后,会把每个控件的信息都解析出来,然后建立一个由ViewNode控件实例组建起来的一棵控件树。

  • DeviceBridge依赖Device: HierarchyViewer在调用DeviceBridge的setupViewServer去准备好ViewServer的时候会把它持有的Device实例传进去给DeviceBridge,DeviceBridge就是通过这个Device实例来组织相应的ADB命令来发送给ADB服务器来操作ViewServer的

  • Device依赖AdbHelper: Device本身并不会连接ADB服务器的socket来发送命令,这些都是由AdbHelper来做的,我们在之前的章节已经见识过了

  • ViewNode组合Window: 每个ViewNode都拥有一个Window成员变量。也就是说每个控件都应该是属于某一个窗口的,一个不属于某个窗口的控件是没有意义的,是不应该存在的

  • HierarchyViewer使用ViewNode: 脚本在调用HierarchyViewer的findElementById的时候,会首先使用DeviceBridge来获取控件列表并建立控件树,最后会遍历由ViewNode实例组成的控件树来获取目标控件

HierarchyViewer架构到了这里就算描述的差不多了,往下我们会进入到实现细节去看下它的实现原理是怎样的。


你可能感兴趣的:(软件测试开发)