DevOps工具链之自动化UI测试-IOS(上)

谈谈IOS开发中的自动化UI测试—Jenkins加上Appium、Macaca等

Posted by Marco Liu on June 20, 2018

“Hope for the best. ”

前言

从一篇文章中看到:“从薪资的角度来看,Stack Overflow网站做了一个统计,从全球调研了6万名工程师,排名第一的大家肯定没有想到,是DevOps专家,第二是机器学习专家。” 不知道作者是不是吹水的,所以放上文章链接 打造易于落地的DevOps工具链

关于DevOps是什么我就不说了(其实我自己也不知道),这篇文章主要是记录我在做iOS自动化UI测试时的一些步骤和总结。

正文

Appium的原理

先放上Appium的GitHub地址:appium

Appium是一个开源的跨平台自动化测试工具,可以进行 iOS、Android 和 Web 测试。Appium的测试用例是如何运行在具体的平台(比如 iOS )上的。为了回答这个问题,我们需要把 Appium 分成三个部分来看,分别是 Appium 客户端、Appium 服务端和设备端。

一句话概括它的原理:Appium提供各个语言的第三方库,将测试脚本转化成 WebDriver 协议下的 URL,通过 Node 服务发送到各个平台上的代理工具,代理工具在运行过程中不断接收 URL,根据 WebDriver 协议解析出要执行的操作,然后调用各个平台上的原生测试框架完成测试,再将测试结果返回给 Node 服务器。

设备端

当你成功的运行了一个 iOS的appium测试后,你会看到手机或者模拟器上多了一个名为 WebDriverAgentRunner 的应用,以后简称 WDA,这个应用的作用就是对你的目标 App 进行测试。

WDA 的原理可以简单的理解为:它能根据被测试应用的 BundleID 将它唤起,然后自己进入死循环保证测试用例一直不退出。此时等待服务器传来 URL 数据,然后解析 URL,分发到对应模块,各个模块根据 URL 指令执行对应的测试操作,最终再把测试结果返回。

Appium 服务端

简单来说,Appium 服务端是一个 Node.js 应用,这个应用跑在电脑上,用于和 WDA 进行通信。刚刚我们看到了截图命令的 URL 是 /screenshot,可以想见还有别的类似的测试操作,所以 WDA 有必要和 Appium 服务端约定一套通信协议。考虑到 Appium 还支持 Android 测试,所以在安卓手机上也有类似的东西需要和 Appium 服务端进行交互。这样一来,约定一套通用的协议就显得非常重要。

Appium 采用的是 WebDriver 协议。在 w3.org 上有一个对该协议的详细描述,而 Selenim 的官网 也介绍了 WebDriver 协议。目前我尚不知道这两处介绍的关系,是互为补充 or 两套规范,但可以肯定的是下面这段话的介绍:

WebDriver’s goal is to supply a well-designed object-oriented API that provides improved support for modern advanced web-app testing problems.

所以简单的把 WebDriver 理解成一套通用的测试协议即可。

Appium 客户端

Appium 客户端就是指我们写的那些测试代码了。Appium 支持多种测试语言的根本原因在于,WebDriver 协议为各种主流语言提供了一个第三方库,能够方便的把测试脚本转化成符合 WebDriver 规范的 URL。比如 https://www.w3.org/TR/webdriver/#list-of-endpoints 就规定了包括截图、寻找元素、点击元素等操作对应的 URL 格式。

我们的项目目前使用Python 语言来编写测试脚本,脚本语言的选择是部门的测试大佬做的决定,所以我自己也在Python,我是在廖雪峰大神的官网上学的,还不错,推荐给大家Python教程


Appium环境搭建

基础环境配置
// 安装Nodejs
$ brew install node
// 安装Appium
$ npm install -g appium 
// 安装carthage
$ brew install carthage
// 安装appium-doctor,用来校验Appium的依赖环境是否正确配置
$ npm install -g appium-doctor

执行完上面的命令之后就基本安装完成了,现在可以执行appium-doctor --ios来校验ios环境。

Appium for mac iOS环境配置

暂时没用真机去测试,所以先不写如何测试真机。

先下载Appium-desktop客户端,这个东西相当于一个node服务器。

  • 1、打开Appium桌面客户端,点击Start Server启动Appium服务端
  • 2、点击Appium桌面端右上角的搜索按钮,设置Desired Capabilities
  • 3、点击Start session,开始测试

第一次启动,Appium客户端会运行WebDriverAgent bootstrap script安装依赖,这里要等一会 依赖安装成功之后,appium 会启动 iOS 设备上的 Safari 浏览器,并弹出 appium inspector 窗口


Macaca

Macaca是阿里开源的面向用户端软件的测试解决方案,其作用类似于appium,并且运行速度比appium快,由于团队考虑到对Jenkins的集成,而appium在Jenkins上的报告更详细丰富,所以最后选择了appium。

先把Macaca的官网搬过来吧,我相信没有人写的比官网更丰富和权威了吧。

macaca的高级进阶还是有得研究的,在这里我只用到了它的元素定位功能,因为它的这个功能比appium上的好用。把iOS端的元素定位出来之后,测试人员就可以写一套测试脚本同时测安卓和iOS了,只需把两套定位元素放上去。

Macaca环境配置

需要先安装 Node.js v8.0 或者更高版本

// 安装ios-webkit-debug-proxy
$ brew install ios-webkit-debug-proxy
// 安装Macaca
$ npm i -g macaca-cli
// 安装驱动(iOS)
$ npm i macaca-ios -g

然后执行macaca doctor来检查环境是否配置成功。

元素查看器

执行npm i app-inspector -g来安装inspector。

然后执行app-inspector -u xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx。 这里的xxxx-xxxx是指设备的UDID。

可以执行命令xcrun simctl list devices查看可用的模拟器.如下图所示

然后就可以查看元素的定位了,如下图所示

鸣谢

感谢各位大牛的开源贡献,文章部分材料摘自以下网站

Appium 从入门到原理
Macaca官网

—— Marco 后记于 2018.06