athrun的InstrumentDriver源码阅读笔记
作者:唯一
athrun是淘宝的开源测试项目,InstrumentDriver是ios端的实现,之前在公司项目中用过这个框架,没有深入了解,现在回来记录下。
官方介绍:http://code.taobao.org/p/athrun/wiki/instrumentDriver/
优点:这个框架是对UIAutomation的java实现,在代码提示、用例维护方面比UIAutomation强多了,借junit4的光,我们可以通过junit4的@Parameters或者Feed4junit实现数据驱动,非常适合生产环境。
【测试|IOS测试框架之(athrun的InstrumentDriver源码阅读笔记)】缺点:木有了UIAutomation的录制功能。
总体来说,InstrumentDriver的优点大于缺点吧。不过现在有了个很棒的测试框架叫appium,支持多种语言编写脚本,能够测试android、ios等平台,录制功能很强大。我知道的appium的缺点主要是android端中文输入很坑,解决方案也不尽如人意,ios端稳定性一般,总体还不错,有机会介绍给大家。不好意思,这里跑题了哈。
开始正文~~~
这里引一张官方的框架图把
文章图片
源码说明
1.InstrumentDriver
MySocket:pc端的Socket服务,建立监听并响应UIAutomation脚本发过来的socket请求。是pc和UIAutomation测试脚本通信的基础,所有元素的操作都会翻译成js脚本,通过Socket连接传送给UIAutomation。
UIAElement:除了UIATarget、UIApplication以外所有控件元素的基类,封装了findElement、printElementsTree、images、buttons等各种控件的属性和方法,大多数的函数都是通过拼接js脚本然后调用MySocket执行。
InstrumentDriverTestCase 所有测试类的基类,封装pc端用例执行的一系列流程,写用例时只需要继承InstrumentDriverTestCase类,然后直接写testcase就行了。
@BeforeClass:环境准备,把JSLib文件部署到工作目录,设置工作目录权限
@Before:a.清理instruments进程,删除临时文件。b.启动serverSocket监听。c.启动instrucments。
@执行用例
@After:a.给客户端发送停止命令。b.服务端停止监听。c.停止instrucments进程
2.JSLib
common.js:UIAutomation脚本,简单封装了脚本运行框架。它初始化了taiget,app,win,host等常用对象,并定义了元素查找、打印等常用方法,是CSRunner.js运行的基础。
CSRunner.js:UIAutomation脚本主体,循环的向serverSocket获取命令,根据命令的类型执行命令,然后返回结果。
runTests.sh:通过脚本调用instruments,执行UIAutomation脚本,应该在serverSocket监听启动之后执行
TcpSocket.sh:shell命令实现的socket客户端,主要功能就是一次客户端的socket的请求,在js中通过host.perfoemTaskWithPathArgumentsTimeout(脚本名,参数数组,超时时间)函数调用。
3.辅助类:
Config:从配置文件中读取参数
DriverUtil:从配置文件中读取参数
ResourceManager:用于部署运行环境
开始举例子了:
一个用例的执行过程(跟上变重复了):
1.环境准备,把JSLib文件部署到工作目录,初始化Instruments的工作目录。这个过程只在第一次用例执行前执行一次
2.初始化MySocket的监听,并启动instrucments,用例准备过程结束
3.开始执行用例,每一条函数的运行过程后边细说
4.a.MySocket给客户端发送停止命令。b.服务端停止监听。c.停止instrucments进程
下一个用例执行时只需要重复2、3、4的过程了
一条命令的执行过程:
以win.findElementByText("input”,0,UIATextField.class) .sendKeys("dfdfd") 为例
1.findElementByText方法拼接js脚本:script = findElements('')~~~并传递给MySocket.getText()方法
2.MySocket从连接队列中取出一条连接,发送脚本信息
3.TcpSocket.sh获取脚本数据,调用common.js中定义的findElements方法,并通过json的方式把数据返回给TcpSocket
4.findElementByText函数把获取的json函数转换为java对象返回来。
5.sendKeys("dfdfd”)是另一个命令了,重复执行1-4的过程。