iOS UI自动化测试详解

发布于 2022-05-16  1,676 次阅读


APPIUM

简介

Appium(基于XCUITest和Accessibility)是一个开源的、跨平台的自动化测试工具,支持多种语言编写用例(python、java、js)。

原理

网图

在iOS平台中,需要把WebDriverAgent编译安装到手机上,WebDriverAgent用于跟苹果的XCTest框架交互,WebDriverAgent还会起一个服务,监听Appium客户端发送的指令。

整个流程就是这样子: 测试脚本 -> Appium -> 把脚本转化为json数据 -> 传输到WebDriverAgent -> 转化为XCTest可识别的指令 -> 控制app执行

APPIUM在iOS下测试工具的变革

  • iOS 9 之前一直以 instruments 下的 UIAutomation 为驱动底层技术(弊端由于 instruments 的限制,单台 mac 只能对应单台设备);
  • iOS 9.3 时代推出 XCUITest 工具,用以替代 UIAutomation;
  • iOS 10 时代苹果直接废弃了 UIAutomation、Facebook 推出 WebDriverAgent(实现的 server 能够支持单台 mac 对应多个设备,目前Facebook不再维护);
  • Appium 在 iOS 9.3 后全面采用 WebDriverAgent 的方案

iOS UI自动化测试核心技术

上文中提到两个关键的技术

  • XCUITest
  • WebDriverAgent(也称WDA)

XCUITest

在2015 年,Apple 发布了 UI 自动化测试框架 XCUITest 并集成在 Xcode7 中,而 iOS/macOS UI 自动化测试依赖两个核心技术:XCUITest 和 Accessibility。

XCUITest 是集成在 Xcode 中的测试框架,若想使用 UI 测试功能,可以在创建 iOS 项目时勾选 Include Tests 选项,从而使项目具备自动化测试的能力。而 Accessibility 技术,则是 Apple 官方为视障用户提供的一整套使用 iOS/macOS App 的解决方案。

对于 Accessibility 技术,开发人员需要注意的是,XCUITest 框架默认并不能将所有视图元素审查到,只会审查到可以被 VoiceOver 功能读取文字的元素。比如,UIButton 和 UILabel,这些视图对于视障用户而言可以通过语音来获知其内容,而对于 UIImageView、 UIView 这种对于视障人士并不友好的 UIKit 视图元素默认是不会审查到的,所以编码时要另行配置 Accessibility 相关属性,以保证其支持 Accessibility 从而在 UI 自动化查询的元素层级中可见。

基于 XCUITest 框架 和 Accessibility 技术的自动化测试,有利于 App 进行数据一致性校验,但 UI 一致性校验能力较弱。比如,App 可以针对某些数据请求结果或者某个元素是否存在进行校验,而视觉展示效果却仍需要人工介入。

XCUITest框架结构

XCUITest 测试框架 API 主要包含:元素查询(UI Element Queries)相关类型,如 XCUIElementQuery,UI 元素(UI Elements)相关类型,如 XCUIElement,以及测试 App 生命周期类型(Application Lifecycle)类型,如 XCUIApplication。

appium XCUITest 驱动的开发在 appium-xcuitest-driver 仓库进行

WebDriverAgent

WebDriverAgent (也被叫做"WDA") 是 Facebook 管理的项目, Appium 核心团队对项目做了很大的贡献。 WDA是一个运行在 iOS 模拟器或设备上暴露 XCUITest API 的服务,兼容 WebDriver。Appium 的 XCUITest 驱动把 WDA 作为对 Appium 用户不透明的子进程控制, 代理发送给和接受自 WDA 的命令, 并且提供大量额外功能 (比如模拟器控制及其他方法)你可以启动、杀死应用,点击、滚动视图,或者确定页面展示是否正确

  • 通过连接 XCTest.framework 调用苹果的 API 执行动作;
  • 支持多个设备同时进行自动化;
  • Appium官方已经集成(目前已由APPIUM官方进行维护)
./Scripts/bootstrap.sh
这是老版本的启动方式,新版本直接打开WebDriverAgent.xcodeproj(路径/Applications/Appium Server GUI.app/Contents/Resources/app/node_modules/appium/node_modules/appium-webdriveragent)

WDA启动的常用三种方式:

  1. XCode
  2. xcodebuild
  3. tidevice

集成CI

xcodebuild -project /Applications/Appium\ Server\ GUI.app/Contents/Resources/app/node_modules/appium/node_modules/appium-webdriveragent-bak2/WebDriverAgent.xcodeproj -scheme WebDriverAgentRunner -destination "id=fa0c5be2bc4e863e8079f70092dfb35c74071f7f" USE_PORT=8300 test

USE_PORT=8300 指定手机端启动webdriver agent服务时候绑定手机端的端口,默认8100,通过修改端口实现多设备并发执行

-destination 设备id

通过xcode修改默认端口

两种方式都需要添加信任证书

通过tidevice调用 tidevice -u fa0c5be2bc4e863e8079f70092dfb35c74071f7f wdaproxy -B com.facebook.WebDriverAgentRunner.xxxxx.xctrunner --port 8300

常用命令

  • tidevice
  • libmobiledevice/ideviceinstaller

其它

appium服务器初始化配置地址

appium额外支持的capabilities,在appium-xcuitest-driver项目


一名测试工作者,专注接口测试、自动化测试、性能测试、Python技术。