基于Macaca(Java)的客户端功能自动化回归实践(Android & iOS通用校验)
0.引言
Macaca是由蚂蚁国际无线团队研发的跨终端自动化测试方案,同时支持Android、iOS、PC,用户层提供了统一的Api。对于Android和iOS客户端而言,同一个App,自动化测试脚本中的执行、校验部分可以做到统一通用,极大地降低自动化测试脚本的编写和维护成本,也确保了多端校验的统一。
- 汇率工具Android实践(左图)及iOS实践(右图)【Gif图质量存在失真,完整的Android和iOS视频见文档末尾】:
1. 环境准备
1)Macaca 安装Android和iOS对应的驱动
Macaca安装在ATA中已经很多文章有所涉及,推荐直接官网查看:https://macacajs.com/
安装完成之后确认,输入:
macaca doctor
2)App Inspector安装
参考官网的说明:http://macacajs.github.io/macaca/inspector.html
1.安装:
tnpm i app-inspector -g
2.运行:
app-inspector -u Udid --verbose
备注:
1)Udid对于Android手机机通过“adb devices”命令获取:
2)Udid对于iOS手机可以通过“Xcode-Window-Devices”查找到对应的identifier:
3.运行完“ app-inspector -u Udid --verbose ”会自动打开浏览器,然后通过页面查找元素属性:
属性获取说明【"name"、"css"、"xpath"、"id"、“link text”、“partial link text”】:
1)Selector的具体选择规则
Selector | iOS | Android |
name | label or value or accessibility Id | content-desc or rawtext |
xpath | XPath | XPath |
class name | class/type | class |
id | accessibility Id | resource Id |
link text | all property | rawtext |
partial link text | all property(partial) | rawtext (partial) |
2) Selector对应java代码中的样例如下表:
Selector | iOS | Android |
name | String elementName = "汇率工具" | String elementName = "汇率工具" |
xpath | 1)完整xpath: String elementXpath = "//XCUIElementTypeApplication[1]/XCUIElementTypeWindow[1]/XCUIElementTypeOther[1]/XCUIElementTypeNavigationBar[1]/XCUIElementTypeButton[2]" 2)相对xpath: String elementXpath = "//XCUIElementTypeButton[@property='**']" (property表示xml上的属性名称) |
1)完整xpath: String elementXpath = "//android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.RelativeLayout[1]/android.widget.RelativeLayout[1]/android.widget.ImageButton[1]" 2)相对xpath: String elementXpath = "//android.widget.ImageButton[@property='**']]" (property表示xml上的属性名称) |
class name | String elementClassName = ''android.widget.EditText'' | String elementClassName = ''Button'' |
id | String elementId = "com.alipay.mobile.ui:id/social_search_normal_input" | String elementId = "CreditCardTextField" |
link text | String elementLinkText = "label=人民币 CNY" | String elementLinkText = "人民币 CNY" |
partial link text | String elementPartialLinkText = "label=人民币" | String elementPartialLinkText = "人民币" |
3) 常见Tips:
- Android的xpath在列表页最好不要用,因为随着页面滑动(页面可见区变化),同一个元素对应的xpath是会变化的;【原因:iOS是dump整个页面的xml,Android是dump可见区域的xml】
- swipe()因iOS特性,对于滑动的初始点击响应较为灵敏,需要将Scroll duration设置小一些,确保能够滑动成功,建议值100 ms,否则可能变为drag事件;
- 另外同样由于iOS是dump整个页面的xml,Android是dump可见区域的xml的原因,对于findElement(),iOS只要元素存在在页面中,不管当前是否可见,均可找到,但是对于Android必须要元素存在于当前可见范围才可找到;对于该情况需要先用isElementExist()判断寻找的元素是否当前可视区可见(Android & iOS同);
- 运行app-inspector时,WebDriverAgent工程如果是用的自己的AppID签名的话需要将修改一下,比如加个后缀,能够区分即可【macaca ios驱动中也有一个WebDriverAgentRunner工程,跑iOS用例时报错时一样的方法处理】;即报如下错误时:
通过报错信息上面的信息可以查找到对应的工程目录:
搜索com.facebook.WebDriverAgentRunner,将工程的Product Bundle Identifier修改加个后缀即可;
2. 功能回归用例(Android & iOS 通用校验)
本文主要讲解如果通过UI用例回归验证功能,在功能测试覆盖阶段将能够自动化的功能用例Cover掉,减少人工执行实践,并可持续回归;因为Macaca做到了用户层Api的统一,所以基于Macaca可以做到Android和iOS校验执行用例的统一,仅仅是各自元素的指定需要单独分别维护。
1)用例编写
下面直接通过在“汇率工具”项目中的实践来说明用例编写:
1.工程目录及对应的说明如下图:
2.config.properties说明:
3.BaseTest说明
4.Capabilities说明
特别说明:对于autoAcceptAlerts(弹框处理)尽量不要全局设置为true(降低性能、影响业务功能测试),可以在用例中通过主动调用函数acceptAlert();
其他参考:https://macacajs.com/desired-caps
5.Page元素获取说明:
特别说明:如此设计之后仅仅需要维护page类中的Android和iOS元素,具体的用例不需要关心具体的元素指定;
6.测试用例说明:
用例编写如下,主要是操作对应的元素,然后校验元素值的准确性,java版本api:https://macacajs.github.io/wd.java/
2)用例执行
1. 起macaca server
macaca server --verbose
备注:钱包国际业务工程地址:http://gitlab.alipay-inc.com/yadong.zyd/AlipayWalletIntlBizMacaca
2. 编译器里面run testcase即可
目前Macaca JS版本已经接入SLM,Java版本正在接入中,接入之后则可以持续集成(线下也可以通过Jekins配置搭建),此外也可以通过功能用例去跑兼容性;
整个接入Macaca(Java)版本遇到了很多的问题(环境、api等等),最后通过和Macaca项目组的共同分析和跟进,基本得到了解决,大家在使用过程中也可以与我们联系;