基于appium框架的iOS UI自动化实践

阿凡达2018-06-21 13:51

前言

由于iOS系统的封闭性,加上相对Android用户的数量少,导致对iOS平台系统的自动化进展缓慢。据了解,很多iOS平台的测试人员仍旧处于纯手工测试阶段,但是很多场景下,人工测试效率低且易错。例如:

  • App的核心功能需要多次回归,相当耗时
  • 开发在写API请求相关代码的时候没有做数据容错,线上环境易错

进行自动化测试之前,我们需要考虑:

  • 测试业务变动是否频繁?
  • 测试业务是否属于核心功能?
  • 编写测试代码的成本?
  • 自动化测试是否能保证测试结果的准确性?

目前,我主要负责人工智能部门的洞见APP,已经上线稳定版本,小版本迭代较快,且测试业务都是核心功能,大量的人工回归测试效率太低,推进UI自动化工作是十分必须的。当然,洞见App包含了ios+unity+算法,因此推动UI自动化存在很多难点,我们先定个小目标:搭建UI自动化的框架,先完成登录界面的UI自动化,后续涉及到unity和算法相关内容的自动化,我们将慢慢研究探索。

框架的选择

iOS UI自动化测试框架有不少,前期调研各类框架的优劣,对于后期的实践十分重要。下面针对几种常见的框架特点进行对比分析:

 

本人比较熟悉java语言,考虑到appium框架跨平台,所以选择appium框架进行UI自动化实践。

Appium简单介绍

  • 跨平台,支持Android,iOS
  • 基于官方的测试框架进行的集成和扩展
  • 支持多种语言编写(上表有介绍)
  • C/S架构,通过HTTP进行Client和Server的通信

Server:

Appium 服务端定义了官方协议的扩展,为Appium 用户提供了方便的接口来执行各种设备动作,例如在测试过程中安装/卸载app。

Client:

简单来说,client就是我们的测试脚本,仍然秉承selenium web UI的测试思路,测试数据、ui控件描述和测试逻辑三者之间的独立。

环境搭建

前提准备:

  1. 安装了Xcode的Mac机器
  2. iPhone设备一台——洞见App的特殊性,只能使用真机才能跑起来
  3. 如果是真机调试,需要开发者账号以及证书(找相关开发咨询)

注意:

  1. 必须先将iOS模拟器上的环境搭建成功,再来搭建真机上测试环境(坑比较多)
  2. 每个版本的Xcode对于的SDK版本不同,可以使用以下命令查看Xcode支持的iOS版本以及模拟器版本,之后在Appium项目配置中可能会涉及到相关的问题。

    $cd /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport #进入改目录查看Xcode对应支持的iOS设备型号

    $xcrun simctl list #查看模拟器的版本型号

安装appium

有两种方式:

  1. 命令行安装

    $brew install node #get node.js

    $npm install -g appium #get appium

    $npm install wd #get appium client

    $appium & #start appium

    安装完成,在命令行终端查看各自版本即可。

  2. 下载.dmg包,安装可视化界面应用(可定位元素)

官网地址:http://appium.io/downloads.html

下载Appium Desktop Apps

==注意:Appium1.6.x支持Xcode 8,我使用的是Appium1.6.4;Appium,Xcode,SDK,iOS等版本匹配问题特别注意==

安装相关依赖

  1. 安装Homebrew

    /usr/bin/rubye"(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

  2. 安装carthage

    $brew install carthage

  3. 安装webpack 这个非常重要,和WebDriverAgent相关,网上很多人用npm安装,我一直安装失败,所以采用brew安装

    $brew install webpack

  4. 进入WebDriverAgent安装目录,运行bootstrap

    $cd /usr/local/lib/node_modules/appium/node_modules/appium-xcuitest-driver/WebDriverAgent/

    $mkdir -p Resources/WebDriverAgent.bundle

    $sh ./Scripts/bootstrap.sh

  5. 安装JDK——使用brew在线安装jdk,环境变量直接配好

    $brew install jdk

  6. 安装IntelliJ IDEA(Eclipse),下载.dmg包安装或者命令行下载都行
  7. 安装Maven

    $brew install maven

  8. 设置环境变量

    $cd ~

    $open .bash_profile

    修改.bash_profile文件,配置环境变量。

  9. 安装ios-deploy(真机依赖)

    $ npm i -g ios-deploy

  10. 安装libimobiledevice(真机依赖)

    $brew install libimobiledevice --HEAD

至此mac端的相关依赖安装结束。

安装WebDriverAgentRunner到真机(我的是iPhone 7)

==tips:==

WebDriverAgent是Appium1.6.3以后版本新添加的模块,为了让appium与iPhone(基于xcuitest)设备进行通信而添加的。但是,这个模块在是一个独立的项目,在使用前必须编译、安装。appium是通过手机上WebDriverAgentRunner,来运行测试的,没有这个在真机上没有办法测试(模拟器上需要着个,不过会自动安装)

1.WebDriverAgentRunner编译

  • 进入WebDriverAgent安装目录。运行bootstrap(如果前面依赖操作过,这里可以忽略)

    $cd /usr/local/lib/node_modules/appium/node_modules/appium-xcuitest-driver/WebDriverAgent/

    $mkdir -p Resources/WebDriverAgent.bundle

    $sh ./Scripts/bootstrap.sh

  • 用Xcode打开WebDriverAgent 双击WebDriverAgent.xcodeproj打开此项目。

  • 编译WebDriverAgentLib 不选中Automatially,在Team里面添加开发者账号 
  • 编译WebDriverAgentRunner 不选中Automatically,导入证书。其他的几个模块也是如此。     

2.WebDriverAgentRunner安装

  • 连接手机和Mac电脑
  • 建立服务WebDriverAgent ,关闭Xcode,进入WebDriverAgent文件夹

  • $cd /usr/local/lib/node_modules/appium/node_modules/appium-xcuitest-driver/WebDriverAgent

  • $xcodebuild -project WebDriverAgent.xcodeproj -scheme WebDriverAgentRunner -destination 'id=真机的udid' test看到手机上有WebDriverAgentRunner的app即可。

启动appium(server)

我这里安装的是appium-desktop-1.0.0.dmg包(对应appium server1.6.4),可视化界面,双击应用程序即可打开。说明:appium1.5.3以后的GUI逐渐不再维护,后来才出了desktop版本,界面较appium1.5.3变化较大,如下图:

 

运行appium demo

client有两种方式:

  1. Appium inspector定位元素
  2. 执行测试脚本

  • Appium inspector

开启appium后,点击Start new session打开appium inspector,定义platformName、deviceName、app、automationName、platformVersion、udid,其中:

  1. app:路径就是通过xcode来生成的路径,这个就是被测对象
  2. platformVersion:iOS的版本号,注意SDK版本
  3. udid:真机调试必须(坑:必须为小写)
    点击Start Session,真机调试成功,界面如下:

  • 测试脚本

appium demo下载地址: https://github.com/appium/sample-code

简单分析测试脚本:

这里我们用Java书写测试脚本,测试脚本工程为maven工程,测试工具使用TestNG或者JUnit都行,工程结构如下:  

  1. 页面元素获取类TestAppScreenSimple
  2. 测试类iOSPageObjectTest

    platformName、deviceName、app、automationName、platformVersion、udid的定义与使用appium inspector一致,加上appium的版本号即可。
  3. pom文件
    通过pom来引入java-client                                                                                                                    

执行脚本:

全集执行或者单个用例执行

 >$mvn test  
 >$mvn -Dtest=com.saucelabs.appium.iOSPageObjectTest test  

开启iOS UI自动化之旅吧....

写在最后

此篇文章主要分析了iOS UI自动化的前提条件、框架的选择、环境的搭建以及真机调试。特别强调的是真机调试前,请在模拟器上调试成功,否则你将遇到无数深坑...个人建议使用Mac电脑,没有Mac电脑没有关系,黑苹果引发的各种奇葩问题会要你有种买Mac的冲动~~希望此篇文章能对大家有所帮助。最后感谢项目组的iOS开发同学以及我们的小磊锅、小小、庆灵大哥的耐心指导和帮助,减少了大量查阅资料和学习操作的时间,站在前辈的肩膀上,视野很开阔~~~。

本文来自网易实践者社区,经作者许华授权发布。