让人兴奋的是,5.0开始,UI Automation 支持录制和回放了。用户在应用上的操作过程被记录下来并生成对应的脚本可以进行回放。虽然录制的脚本回放很不稳定,健壮性不强,录制后需要进行一些简单调整然后加入自己的校验逻辑,但已经很大程度上方便了用例的编写。
针对 instrument 录制的脚本回放不稳定,无提供验证框架及异常处理,我们编写了公共 javascript 类库,对 instrument 原型进行了扩展,加入了统一的验证方法,异常处理,这样编写脚本更加方便,用例也更健壮了。
自动化测试不是简单的录制回放,脚本运行通过就可以了,而是一整套的流程。instrument 支持批量运行 trace 文件中导入的 js 脚本,也支持命令行运行单个脚本,但是这并不能建立一个比较完善的回归体系,从数据准备,到用例编写、调试、维护,回归,运行结果的收集,到测试报表的生成,结果的分析等。针对这些缺失,我们只能从中想出办法补充实现这些功能。比如编写shell遍历目录挨个运行用例,开发日志转换的工具用于解析原始测试结果生成所需格式的文件等。由于 instrument 中 js 脚本无法读取外部文件或者进行数据库操作,这也让数据驱动和数据准备无从谈起。
在内部使用 instrument UI Automation 进行自动化测试的过程中有很多反馈。比较强烈的问题是:录制的脚本如同鸡肋,非常冗余,可读性差(脚本自描述性不好),难以维护,需要进行较大改动才能运行起来;无法单步调试脚本,只能通过打日志的方式查看变量的值;js编写脚本也比较费力,经常出现语法错误找不到错误位置的情况。这大大增加了自动化测试的成本,减低了同学们的使用积极性。
自动化测试是好东西,实施好了,能极大减轻测试人员的重复劳动,节省时间用于关注更深层次的问题,提高工作效率与质量,更好的保障产品的质量。
虽然过程是曲折的,但前途是光明的。为了从根本上避免上述使用过程中遇到的问题,我们开始想办法脱离 js 编写脚本的方式,通过编写java测试用例,来避免脚本无法单步调试、查看变量值,无自动语法检查、代码智能感知等极大影响自动化测试体验的弊端。java强大的文件读写,数据库操作也让数据驱动和数据准备的实现成为可能。加上java能与丰富的外部工具进行方便的集成,这更坚定了我们采用java实现的决心。
由于iOS系统本身的封闭性,给自动化测试带来了诸多挑战,要么在应用中注入测试代码进行自动化测试(eg:我们的 AppFramework),要么使用官方的 instrument。两种方式各有利弊,怎样在这之中寻求一种更好的方式呢?通过调研发现 instrument 提供的一个在脚本中能够调用外部shell的“漏洞”,让我们想法的实现成为可能。基于此,有了 InstrumentDriver 的实现。
InstrumentDriver 整体框架图:
[caption id="attachment_15502" align="aligncenter" width="483" caption="图1 InstrumentDriver 整体框架图"] [/caption]
Server/Client 示意图:
[caption id="attachment_15458" align="aligncenter" width="651" caption="图2 Server/Client 通信示意图"] [/caption]
InstrumentDriver 的实现有以下功能特点:
1. C/S 模式运行。
框架分为Server端和Client端,双方进行socket通信传递消息:Client端(Mobile)负责请求测试步骤运行,并返回运行结果;Server端(Java用例)负责响应Client请求并接受测试步骤的运行结果。C/S模式的实现,甚至可以脱离Mac在PC上编写、调试测试用例(运行肯定离不开Mac系统),在熟悉的window环境下,让用例编写更加得心应手。
2. 纯Java语言编写测试用例,很好的兼容了instrument js格式的API。
InstrumentDriver 用Java实现了各元素类型的之间的继承关系以及各元素类型所提供的操作方法,还扩展了一些更易于使用的操作,如滑动操作等。熟悉instrument js语法格式的测试人员可以很快用java语言实现测试用例。
3. 提供了清晰的控件树状结构打印及便利的元素查找方法。
可以树状结构打印出当前窗口的所有元素或某一元素下的所有子元素。输出属性中不仅包括各元素的基本属性(name,value,label,rect等),更包括代表该元素的guid,用例中直接使用该guid属性即可代表该元素进行相应操作。findElemenByText及相关重载方法可以很方便的根据元素的显示文本,类型,索引组合查找该元素,极大提升了用例的自描述性和可维护性,也更好的简化了用例的编写。
4. Debug模式和非Debug模式运行
用例可以debug模式和非debug模式两种方式运行。debug模式通信时传递json对象或数组,返回后实例化为具体对象。可以调试脚本,查看相关对象的属性值。非debug模式仅在需要操作UI元素或获取UI元素属性的时候才通信,较大的提升了运行速度(debug模式的2倍左右)。可以这么认为:用例debug模式通过后,非debug模式也能运行通过。
5. Junit方式运行测试用例
InstrumentDriver 以大家熟悉的Junit方式驱动测试用例,具备了Junit单元测试的所有优点。可以更好结合其它工具进行持续集成和数据准备。如结合svn,maven,hudson进行持续集成,通过iTest进行数据准备等。
一些截图说明:
下图是UI Automation录制的脚本截图
可以看到,脚本非常冗长,只能通过元素的子元素一级级往下查找,很多索引方式生成的脚本自描述性不高,页面稍有变化,不能很快找到对应的脚本进行更改,这样维护成本是很高的。
[caption id="attachment_15441" align="aligncenter" width="835" caption="图3 UI Automation录制的脚本截图"] [/caption]
对比 InstrumentDriver 的 java用例,同样功能的用例实现截图如下:
[caption id="attachment_15505" align="aligncenter" width="573" caption="图4 InstrumentDriver java 用例"] [/caption]
可以看出 InstrumentDriver 提供的 printElementTree 方法可以打印出当前window所有元素, findElementByText 方法能很精确的查找到相应元素。这样根据脚本就知道这一步骤的具体行为,自描述性大大提升,可维护性更好。
下图是 printElementTree() 方法 的具体输出,树形打印出win下的所有元素:
[caption id="attachment_15500" align="aligncenter" width="793" caption="图5 PrintElementTree 输出示例"] [/caption]
这里我们可以根据输出方便的找到需要操作的元素,并且可以直接使用该元素的 guid 属性代表该元素,插入用例进行相应的操作。更推荐的做法是使用findElementByText进行定位,假如text(name,value ,label属性)都为空,可以查看父级元素或者更上级元素是否有text属性,然后使用elements() 索引定位,可以最大化缩小范围,使脚本更健壮,可读性更高。
下图是用例调试过程中,变量值的查看示例:
[caption id="attachment_15492" align="aligncenter" width="769" caption="图6 debug 模式调试用例,查看变量值"] [/caption]
Debug模式运行,Client 会详细返回对应操作的信息,Server 端接收后实例化为具体对象,调试中可以查看具体对象的属性值(name ,value,label,rect,guid),方便调试用例,更快的找到问题所在。
InstrumentDriver 刚刚诞生,正逐渐用于iOS自动化测试中,肯定还有很多改进的地方。希望在使用过程中得到更多的反馈,通过不断改进,进一步让它完善起来,更好的服务于大家。
源码地址 http://code.taobao.org/p/athrun/src/trunk/iOS/InstrumentDriver/
匿名
我在mac中使用eclipse 导入了 isntrumentDriver ,但是在pom.xml中报Missing artifact org.athrun.ios:instrumentDriver:jar:1.0.1- SNAPSHOT 请问报这个错是啥原因
匿名
旺交流群:885358619搜索不到指定的账号啊,亲
匿名
颜色问:你们如何解决鼠标手势呢? target.dragFromToForDuration("{x:66, y:276}", "{x:247, y:276}", 1); target.dragFromToForDuration("{x:247, y:276}", "{x:247, y:502}", 1); 在一条直线上可以操作,非直线没办法通过多条指令操作。 有什么方法可以操作呢?
匿名
1.这个框架如何来实现数据参数化,从Excel读取数据每行数据,循环执行每个脚本。 2.测试报表 我想如果有这两个功能,就更完善了。
ziyu
谢谢提供的好的建议,让我们一起把她更完善起来,服务好更多需要的人.
匿名
我用testng代替junit框架来执行案例。数据用Excle保存。
匿名
使用TestNG替换了原来Junit4进行单元测试。总体感觉TestNG比Junit4功能丰富。 1. 更合理的suite启动配置,允许你穿插测试类中的方法; 2. 提供了测试参数的定义,可以用xml和Excel提供数据驱动测试; 3. 可定义跳过Case,这个功能很必要在Junit中只能靠注释掉解决。 4. 在执行错误后能够实现只运行执行失败的case 4. 测试执行结束后有个报表,可以继承到Jenkins。用testng-xslt project转换报表,报表样式不错。URL: http://code.google.com/p/testng-xslt 解压把saxon-8.7.jar文件放到lib下,把testng-results.xsl文件放到TestNG生成的test-output目录下,再执行ant脚本就可以生成新的样式的测试报告了。
匿名
JUnit4也能失败重试,并且多线程执行;是自己扩展的,开源的可以修改,http://blog.csdn.net/neven7/article/details/43529569
匿名
框架已经改写完成,有空交流一下。旺旺帐号被锁定了,一直没加入你们的旺旺交流群。
匿名
兄弟,留下个联系人方式可以交流一下
匿名
子雨,方便的话加一下我qq:492004211
匿名
我再弱弱问一句,这个可以成为iphone手机第三方应用的自动化测试框架吗???
匿名
子雨,方便的化请加一下我的QQ,649035177,有问题想你请教,谢谢
匿名
子雨,我在Mac下配置maven时,文档有这么一句话,“我们只需要在mac本地配置一下即可。具体配置:家目录新建.m2隐藏目录,向框架作者获取配置文件并放在该目录中!”,配置文件是向你获取吗?
匿名
这个是内部文档,使用的是内部的maven仓库,所以需要公司内网的配置,外面是不行的。计划放到集团的公共maven库,这样就内外网都可以使用了。
匿名
shellCmd: /Users/nishijia/InstrumentDriver/runTests.sh /Users/nishijia/Documents/TaoTest.app /Users/nishijia/InstrumentDriver true 923fad72b8e6d395405c563d495f9928e7faf703 Instruments: Instruments: instruments -t /Platforms/iPhoneOS.platform/Developer/Library/Instruments/PlugIns/AutomationInstrument.bundle/Contents/Resources/Automation.tracetemplate -D instrumentsDriver /Users/nishijia/Documents/TaoTest.app -e UIASCRIPT /Users/nishijia/InstrumentDriver/CSRunner.js -e UIARESULTSPATH /Users/nishijia/InstrumentDriver/log/ -v Instruments: Error: /usr/bin/xcode-select returned unexpected error. 在eclipse 设置好了 运行case 有错误, 怎么解决? 有联系方式吗? 885358619 这个貌似搜不到了
匿名
问一个很小白的问题:怎么在真机上运行呢?求使用手册。。呵呵
匿名
您好,那个在ios 6.0模拟器下运行这个Demo1 输入keyboard.typestring("abacd\\n");这里好像不是点到Done 是点到了space
匿名
请使用 \\\\n 代替,这个会更正过来的
匿名
发现demoapp在6.0模拟器点击Demo 3会发生crash,运行的时候能不能选择使用哪个模拟器的啊?
匿名
问一个小白的问题:请问如果使用iPhone真机,进行单个第三方应用程序的功能测试。这个测试框架适用么?
匿名
请问 该框架可以在真机上运行吗?。有没有交流群啊?求加入
匿名
可以在真机运行的,旺交流群:885358619 ,欢迎加入,thanks
匿名
在真机上运行是如何配置的?
匿名
在mac环境下,如何配置呢 哪个app 和 apid 是很么东东啊???
匿名
只能装载mac环境下吗?我在ubuntu 搭建的android环境怎么装?
ziyu
运行不可能离开Mac,因为是基于instruments的。但是可以在windows下编写、调试用例,参考我上面的回复。
ziyu
你好,以后文档会先在这里更新: http://code.taobao.org/p/athrun/wiki/instrumentDriver/ 交流、提问与回答在这: http://code.taobao.org/p/athrun/issues/ 不仅仅是源码贡献,其它任何意见与建议也都是对开源的支持~
ziyu
:),只是自动化实践中遇到的一些问题说明,寻求的改进及思考
ziyu
是权限问题,你更改下 Tcpsocket.sh 这个文件的权限 为 777
太禅
server端只能在mac下,因为要基于instrument机制,windows上没有。
ziyu
可以变通的实现在PC上编写、调试单个用例:在Tcpsocket.sh 里设置好对应 PC的 IP, PC运行用例时 setUp方法不再调用 instrument 命令(临时注释掉),然后手动在mac上用instruments运行启动下 CSRunner.js , 就可以开始通信调试脚本的。后续可以尝试在windows上直接用命令连接到 Mac调用,类似SSH连接的
ziyu
使用文档暂时还没写好,isntrumentDriver 基于junit运行,Mac下将 isntrumentDriver 项目导入eclipse,就可以新建测试用例并开始调试运行了。就一点要求,把项目LibJS文件夹下TcpSocket.sh 这个文件放到 目录 /Athrun 下。(这个文件的位置在 CSRunner.js 里面设定的,可以根据情况更改) Mobile自动化测试 旺旺交流群:885358619 ,欢迎加入,thanks
太禅
可以去下载开源代码看,有示例。 http://code.taobao.org/p/athrun/src/trunk/iOS/InstrumentDriver/