接触macaca已经有一段时间,从开始的对于ui自动化的调研开始,将macaca与appium,robotium等自动化方案进行了多方对比,最终macaca脱颖而出成为团队的敲定方案,随后经历了macaca从js版本到java版本的迭代,踩了很多坑,积累了很多经验教训,在这里总结沉淀一下,以方便后来人少走弯路,加快脚步。
macaca是一套基于webdriver标准协议开发的开源自动化解决方案,旨在解决跨平台,跨终端的ui自动化测试的短板问题,减少繁杂、重复的人工工作,降低自动化测试的上手门坎。终端上,macaca同时支持native(ios&&android)、hybrid、mobile web、以及pc端的自动化测试,用例编写上,macaca采取cs架构,可以支持任意编程语言的封装,目前已支持javascript、java、python三种语言,感兴趣的同学甚至可以自行封装支持任意自己习惯的语言。目前,macaca在testerhome上的关注度以及活跃度都保持着强劲的势头,他不只提供了基础的用例编写功能,更提供了性能数据,包含电量、内存等指标的采集功能的附带模块,以及一套分布式持续集成系统供有需者选择,选择macaca作为ui自动化的框架,将为大家提供很大的便利性。
首先要讲的是macaca对于系统环境的依赖,因为执行ios平台的自动化测试需要依赖于mac系统的xcode工具,因此对于实践macaca的同学来说,建议使用mac系统,windows系统也可以用,但受限于xcode工具,windows系统上无法支持ios平台的测试,对于android、pc等的测试则不受影响。
简易安装步骤如下:
安装node.js 要求v4.0及以上(据说v7.0的也不行,所以建议7.0以下)
xcode 要求v7.3及以上(用mac的同学直接从appstore安装就可以)
ios-webkit-debug-proxy
安装android sdk ,配置android_home
解决npm因为部分依赖被墙导致安装失败的问题,当然此选项是可选项,如果大家用npm可以直接安装成功,则不用考虑这一步
安装cnpm成功后,在执行所有npm命令的时候替换为cnpm即可。
eg:
安装macaca
安装对应各平台的驱动ios/android/chrome/electron(desktop应用),对于不需要的,可以跳过
安装app-inspector,用于控件查找
以上步骤执行完成后,执行macaca doctor命令进行校验,如图所示,则表示环境都准备ok了,如果有报红色提示的,则需要对应的解决:
在此总结几条踩坑记录:
1.关于jdk版本问题,咨询过macaca团队的同学,对于jdk的版本是没有具体要求的,之前在1.7的版本下也成功安装过,但是后期重新安装过后总是提示如下错误:
经过查询,version 52.0对应的是jdk1.8版本,于是更新本地jdk版本为1.8 问题成功解决。
2.android sdk问题,macaca支持android最低版本为api18, 请注意,另外build-tool请不要安装预览版。
如果出现如下图提示,说明安卓相关环境没有配置完全,需要通过android sdk manager下载相应的sdk.
<a href="https://github.com/macacajs/macaca-test-sample-java">https://github.com/macacajs/macaca-test-sample-java</a>
通过eclipse导入maven工程,会发现工程结构相当简单,只有一个sampletest.java类,之所以如此简洁,是因为demo工程将macaca的java源码库以maven源的形式配置到了pom.xml中:
如上图,可知道当macaca有更新时,可以通过修改上图中的version版本号来实现库的更新。
对sampletest.java源码的分析:
*setup()方法主要用于配置被测应用的基础信息,包含平台版本,系统版本,安装包路径等,demo实例中提供的为一个pc端的实例,当配置移动端应用测试时,相关参数稍有不同,后面会给出对应移动端的setup()配置
*移动端的setup()配置信息实例
针对如上代码,需要注意的是,对于ios平台,app的安装包需要基于.app包压缩后的zip包,而不能用.ipa包进行压缩,对于模拟器,可以直接安装使用,但是对于真机,则需要涉及证书签名等问题,关于这个,后期会做详细介绍。
*测试用例编写
可能习惯java的同学对于测试用例的这种链式写法有些不习惯,个人认为这样写与javascript版本的迁移有所关联,优势在于可以便利的实现连续的ui操作,而不用一行行写重复样式的调用,而实现这种语法的关键在于源码中每一个接口,比如elementbyid(),sendkeys()都返回了driver本身,如下:
同javascript版用例不同的一点是,javascript版本的用例可以直接通过一条命令启动macaca server并运行case,而java版的用例则需要单独启动macaca server,然后执行测试用例,具体操作如下:
如果想查看启动中的详细信息 可以追加--verbose参数 $macaca server --verbose
注:mvn -s的作用在于使maven以工程目录下的settings.xml文件为依据下载依赖,但是实践中发现部分同学会出现mvn -s无法生效的作用,这样会导致依赖下载失败,这种情况下,需要大家将工程目录下的settings.xml中的配置相应的添加到本地settings中。
这样就可以看到自动执行的测试效果了
实际应用中自动化用例的编写很多情况下都是查找控件并操作,于是如何快速高效的查找控件成为了一件关乎效率的大问题,最早的时候对于安卓,查找控件依赖于android自带的uiautomator viewer工具,ios则依赖于xcode中的accessibility inspector工具,但是这两种工具查找起来相对麻烦,效率相对低下,针对这个问题,macaca团队提供了统一的inspector工具,可以以web的方式方便的查看不论是安卓还是ios的控件。
官方教程包含环境搭建/api参考(js、java、python)/ci集成等最权威的指南,参考首选。
testerhome上包含很多实际应用的帖子,很多步骤介绍的比较详细并配有截图,以及暴露了很多开发者使用过程中的坑,对于扫盲非常有帮助
想深入了解macaca原理的同学可以研究macaca的源码,macaca团队将每个模块单独建立了代码库,看起来清楚明了。如果在开发中遇到了框架层面的问题,也可以在对应的github上提issue,甚至可以提交pr参与到macaca的共建中,作为开源框架,macaca需要大家共同努力发扬光大。