iOS 自动化测试 Xcode UI框架

⚡ 智能摘要

iOS自动化测试 Xcode 记录并重放针对被测应用程序的用户界面操作,遵循设计、测试、实现和再次测试的测试驱动循环,直到每个用例都通过为止。

  • 🔘 TDD周期: iOS 应用测试分为四个阶段:设计、测试、实施和再次测试。
  • ☑️ 前提课程: 一台运行 OS X 的 Mac Xcode 已安装 IDE、自动化框架和 iOS SDK。
  • ✅ 仪器路线: 自动化仪器会记录脚本,将其显示在脚本日志中,并可根据需要重放该脚本。
  • 🧪 OCUnit 路线: 一个用 Objective-C 编写的单元测试包目标、一个活动方案、一个测试组和一个测试类。
  • ⚠️ 弃用: UIAutomation 工具已于 1999 年弃用。 Xcode 8 并已移除;XCUITest 是受支持的后续版本。
  • 🛠️ 现代对应词: UI 测试包目标加上 XCUIApplication 查询替换了录制的 Instruments 脚本。

iOS自动化测试 Xcode UI自动化框架针对应用程序运行已录制的脚本

使用 iOS 自动化测试 Xcode

为了保证 iOS 应用的质量,您应该遵循下图所示的测试驱动开发流程。

iOS自动化测试的测试驱动开发周期,包括设计、测试、实现和重新测试阶段。

测试驱动开发 (TDD) 是一种 测试 该模型应用于 iOS 应用测试,并且属于更广泛的实践范畴。 移动测试在此模型中,测试人员必须遵循以下 4 个阶段:

  • 设计: 确定你想测试的内容,并设计测试用例。
  • 测试: 运行所有测试,查看是否有任何测试用例失败。
  • 实行: Rev检查你的代码,修复导致测试失败的错误。
  • 再次测试: 如果测试失败,则回滚到原始设计。如果所有测试用例都通过,则代码满足所有测试要求。

配置 Xcode UI 测试项目

要创建 iOS 测试程序,您需要一台 Mac 电脑。您的 Mac 电脑必须已安装以下软件:

  • OS X — Mac 操作系统。
  • Xcode IDE — iOS 开发工具。
  • 自动化测试框架 — UI Automation、OCUnit 等。
  • iOS SDK 4 或更高。

⚠️ 版本说明: 以上前提条件描述的是编写以下两篇教程时所使用的工具链。在当前的Mac电脑上, Xcode 软件包中已包含 XCTest 和 XCUITest 框架,单独的 UI 自动化工具不再包含在安装包中。以下保留了原始步骤,因为它们记录了框架的工作原理,而现代的等效步骤将在下文中介绍。

如何使用 UI 自动化框架创建 iOS 自动化

以下八个步骤使用自动化工具录制脚本,并针对被测应用程序重放该脚本。

步骤 1)启动仪器

打开XCode -> 打开开发者工具 -> 检测

开场乐器来自 Xcode 打开开发者工具菜单

步骤2)添加自动化仪器

在“仪器”窗口中,选择“自动化”仪器。

在仪器模板选择器中选择自动化仪器

要创建测试脚本,您可以录制一段视频。 测试场景 或者你可以手动编程。

步骤 3)按红色按钮

乐器正在启动——请立即停止录音。如需开始录音,请按红色按钮。

工具工具栏中的红色录音按钮用于开始和停止录音。 trace

步骤 4)创建新脚本

在“脚本”窗口中,单击“添加”>“创建”以创建新脚本。

在“仪器脚本”窗口中,点击“添加和创建”菜单,即可创建新的自动化脚本。

步骤 5)选择目标

你现在位于 Trace 窗口。使用“选择” Target 下拉即可导航至应用程序的调试版本。

选择 Target 仪器菜单中的下拉菜单 Trac指向调试版本的窗口

在这种情况下,苹果公司的样本 简单钻取 该应用程序被用作测试应用程序。它的图形用户界面如下所示。

SimpleDrillDown 示例应用程序界面用作被测应用程序。

步骤 6)开始录制脚本

点击工具顶部或底部的录制按钮来录制您的脚本。

位于 Instruments 窗口边缘的录制按钮,用于启动脚本录制

现在您可以对被测应用程序执行一些 UI 操作,并且您的脚本将被录制下来。

步骤 7)查看脚本

要查看脚本,请点击 Trace 日志/编辑器日志下拉菜单,切换到脚本日志视图。

Trac“日志”和“编辑器日志”下拉菜单用于切换到脚本日志视图

您将看到您录制的脚本。

已录制的 UI 自动化脚本显示在 Instruments 脚本日志视图中

步骤 8)播放脚本

按下播放按钮。脚本开始运行,日志显示完毕后即可停止。

在“仪器”窗口中回放已录制的自动化脚本并显示日志输出。

⚠️ 历史注释: 这八个步骤中使用的自动化工具已弃用。 Xcode 8 及之后版本已移除,因此当前版本中不再包含此功能。 Xcode 安装步骤。此处保留这些步骤作为框架工作原理的记录;对于新的工作,请使用本页下方的 XCUITest 演练。

如何使用 OCUnit 框架创建 iOS 自动化

第二种方法将测试放在内部 Xcode 投影本身而不是在 Instruments 内部。

步骤 1)开始 Xcode IDE,添加单元测试包目标

向现有单元测试包目标添加单元测试包 Xcode 项目

步骤 2)编写新的单元测试包的名称 如图所示,然后单击“完成”。

步骤 3)将单元测试设为活动目标

选择单元测试包作为活动目标 Xcode

步骤 4)添加测试类组

创建一个项目组来存放 iOS 单元测试类

步骤5)添加单元测试类

在测试组内添加一个新的单元测试类文件 Xcode

步骤 6)现在开始实施

空的单元测试类 Xcode 编辑器已准备好进行测试实现

OCUnit 使用 Objective-C 语言创建测试程序,因此开发人员必须了解该语言。 Xcode 版本发货 单元测试 而是通过 XCTest 来代替,它同时支持 Objective-C 和 Swift但是,这六个步骤中显示的目标和类别结构并没有改变。

UIAutomation 与 XCUITest:有哪些变化?

由于上面使用的两个框架都属于早期版本的 Apple 工具链,因此有必要明确说明是什么取代了它们以及为什么。

方面 UI自动化(工具) XCUI测试
状态 已弃用 Xcode 8,并从后续版本中移除 苹果支持的 UI 测试框架
测试地点 Instruments 内部的脚本 trac电子文档 UI 测试包目标位于 Xcode 项目
语言 JavaScript Swift 或 Objective-C
测试运行员 自动化仪器 XCTest 与单元测试使用相同的运行器
持续集成 尴尬——通过乐器驱动 与单元测试一起从命令行运行
录音 仪器工具栏中的“录制”按钮 录制按钮 Xcode 编辑器,它发出 Swift

实际结果是,XCUITest 测试套件与普通的项目源代码一样,需要像代码库的其他部分一样进行审查、版本控制和执行,这也是为什么录制的测试套件具有以下特点:trace 型号消失了。

如何使用 XCUITest 编写 iOS UI 测试

现代的八个乐器步骤的等效方法很简短。下面的结构反映了相同的录制然后回放的思路,但输出是源文件而不是…… trace.

  1. 添加目标。 In Xcode 选择“文件”>“新建”> Target 然后选择 UI 测试包模板,或者在创建新项目时勾选包含测试的选项。
  2. 打开生成的测试类。 Xcode 创建一个 XCTestCase 子类,其中包含空的 setup 和 test 方法。
  3. 启动被测应用。 创建一个 XCUIApplication 实例并调用 launch 方法,这将在单独的进程中启动应用程序。
  4. 查询并采取行动。 通过元素查询访问元素(按钮、表格、静态文本),并调用 tap、typeText 或 swipe 操作。
  5. 断言。 使用 XCTAssert 验证操作后预期元素是否存在。
  6. 跑。 从以下位置执行测试: Xcode 测试导航器,或者从命令行运行,以便在持续集成中运行相同的测试套件。

一个最简测试遵循以下形式:

import XCTest

final class AppUITests: XCTestCase {

    func testTappingFirstRowShowsDetail() {
        let app = XCUIApplication()
        app.launch()

        // act on the first row of the list
        app.tables.cells.element(boundBy: 0).tap()

        // verify that the next screen appeared
        XCTAssertTrue(app.staticTexts.firstMatch.waitForExistence(timeout: 5))
    }
}

录制器仍然存在:将光标放在测试方法内,然后在编辑器中按下录制按钮,即可自动生成这些查询,这是上述步骤 6 的直接衍生。更广泛的原则是 自动化测试 直接应用,无需修改。

UI自动化示例 Code

本文包含一些源代码示例,可以帮助您更清晰、更快速地理解教程内容。

UI自动化示例 — UI自动化演示的测试脚本。

常见问题

序号 Xcode iOS模拟器只能在……上运行 macOS因此,需要一台Mac电脑,可以是本地的,也可以是托管的构建服务器。云设备集群和托管CI提供商的存在正是为了确保没有Mac硬件的团队也能运行该套件。

机器学习模型会在屏幕切换时建议替换元素查询,根据根本原因对不稳定的故障进行聚类,并对哪些失败的运行是真正的回归进行排序。这对于 UI 套件至关重要,否则即使是微小的布局更改也会导致多个选择器同时失效。

它能很好地处理重复性工作——测试类脚手架、启动参数、页面对象包装器和断言样板代码。元素标识符仍然需要与实际应用程序匹配,因此每个生成的查询都需要在被信任之前针对正在运行的版本进行验证。

Appium iOS 通过其 XCUITest 驱动程序驱动,该驱动程序取代了旧的 UIAutomation 驱动程序。其优势在于可以使用一种跨平台测试语言来测试 iOS 和 iOS 系统。 Android权衡之下,需要在测试和苹果自己的运行程序之间增加一层额外的层。

单元测试在应用程序进程内运行,并直接调用你的代码。UI 测试则将应用程序作为单独的进程启动,并且仅通过界面进行交互,因此速度较慢,但​​可以验证用户实际体验到的内容。

对于流水线中的大多数功能流程来说,模拟器速度更快,效果也更好。但对于摄像头、生物识别、推送通知、性能测试以及任何涉及硬件传感器的操作,都需要使用真实设备,因此大多数团队会在流程的不同阶段分别运行模拟器和仿真设备。

每次测试都会重新启动应用程序并等待动画加载完毕。设置辅助功能标识符而不是匹配标签,以及等待元素存在而不是等待,可以提高稳定性。ping在测试之间重置状态,并使每个案例都专注于一个旅程。

不能直接这样做,因为语言和元素模型不同。通常的做法是保留旧脚本作为预期覆盖范围的文档,然后将每个场景重写为 XCUITest 测试用例,首先从生产环境中故障率最高的流程入手。

总结一下这篇文章: