Record, replay, and review: UI automation with Xcode
Swift 进阶 3m

Record, replay, and review: UI automation with Xcode

2025年6月9日

在 Apple 官方观看视频

一句话判断

Xcode 的 UI 自动化工作流终于形成闭环了 — Record 录制交互生成代码,Test Plan 配置多语言/多设备回放,Xcode Cloud 云端执行,Test Report 带视频回放和故障点定位。关键是 accessibility 做好了,UI 自动化自然就好用了。

这场 Session 讲了什么

Max 完整展示了 Xcode UI 自动化的四个阶段:

准备阶段:UI 自动化基于 accessibility 框架 — accessibility 提供元素类型、标签、值和 frame,UI 自动化依赖这些信息与 app 交互。关键准备步骤:添加 accessibilityIdentifier(唯一、描述性、不随本地化变化),用 Accessibility Inspector 检查无障碍属性,添加 UI testing target。

录制阶段:在 UI test 源文件中启动录制,Xcode 自动构建并启动 Simulator。你的每次点击、滑动、输入都被录制为 Swift 代码。录制后选择最合适的元素查询方式 — 有 localized string 的元素优先用 accessibility identifier,深层嵌套用最短查询,动态内容用通用查询。添加 waitForExistenceXCTAssert 做验证。可设置设备状态(方向、外观、模拟位置)和 app 启动参数(launchArgumentslaunchEnvironment)。

回放阶段:用 Test Plan 配置多语言/多设备运行。每个 locale 是一个 configuration。UI 自动化相关设置包括录制视频/截图的策略(默认仅失败时保留,可改为全部保留)。Xcode Cloud 可以在云端运行相同的 test plan,覆盖 iPhone、iPad 等多种设备和英/阿/希/德等多种语言。

审查阶段:Xcode Test Report 支持视频回放,交互点以圆点叠加在视频上。失败时刻有 diamond 标记,点击跳转到故障点。故障时刻的 UI 元素叠加显示在视频上,点击元素可以看到代码推荐。可以从 Test Report 直接 View Source 定位到测试代码并修复。

值得深挖的点

  1. Accessibility 是 UI 自动化的基础设施。这不是”做好事”的技术决策,而是直接影响你的自动化质量。accessibilityIdentifier 是 UI 自动化定位元素最可靠的方式,它不随语言变化、不受内容更新影响。

  2. 录制后的查询选择很重要。Xcode 提供多个选项,选择原则:有 identifier 用 identifier,深层嵌套选最短路径,动态内容选通用查询。这决定了你的测试在未来 app 变化后的稳定性。

  3. Test Plan 的多配置是效率倍增器。一个 test plan 配置阿拉伯语(RTL)和德语(长字符串)两个 locale,一次运行就能发现布局问题。这比手动切换语言测试高效得多。

  4. Xcode Cloud 的视频录制是协作利器。团队成员不需要在本地复现问题,直接看云端运行的视频就能理解失败原因。

  5. Accessibility Audit 可以集成到 UI 测试中。在 UI test 中调用 performAccessibilityAudit() 自动检查无障碍合规性。

代码片段

录制后的 UI 测试代码

class LandmarksUITests: XCTestCase {
    func testCreateCollection() {
        let app = XCUIApplication()
        app.launch()

        // 用 accessibility identifier 定位
        app.buttons["collectionsButton"].tap()
        app.buttons["addCollectionButton"].tap()

        // 选择查询方式(录制后从下拉菜单选择)
        app.textFields.firstMatch
            .tap()
            .typeText("Max's Australian Adventure")

        // 添加验证
        let collection = app.buttons["Max's Australian Adventure"]
        XCTAssertTrue(collection.waitForExistence(timeout: 3))
    }

    override func setUp() {
        super.setUp()
        // 设置设备状态
        let app = XCUIApplication()
        app.launchArguments = ["--uitesting"]
        app.launchEnvironment = ["REGION": "AU"]
    }
}

在 UI test 中做无障碍审计

func testAccessibility() throws {
    let app = XCUIApplication()
    app.launch()
    try app.performAccessibilityAudit()
}

最佳实践

  1. 先做 accessibility,再做 UI 自动化accessibilityIdentifier 是 UI 自动化的地基。没有好的 accessibility,录制出来的代码要么不稳定,要么不可维护。

  2. 用 Xcode 的 coding assistant 批量添加 accessibility identifiers。写一句 “Add accessibility identifiers to the relevant parts of this view”,它会自动处理。

  3. Test Plan 至少配三个 locale:你的默认语言、一个 RTL 语言(如阿拉伯语)、一个长字符串语言(如德语)。这覆盖了大部分国际化问题。

  4. 视频和截图设置为”全部保留”。默认只保留失败的,但通过的运行视频对文档、教程、marketing 也有用。

  5. 录制后立即重构查询。把录制的默认查询替换为你精选的 identifier 或最短路径,否则后续维护成本很高。

还有什么值得关注

  • UI 自动化支持所有 Apple 平台:iOS、iPadOS、macOS、watchOS、tvOS、visionOS(Designed for iPad)。同一套自动化可以在多个平台运行。
  • XCUIApplicationopen(_ url:) 方法可以测试 deep link 和 URL scheme。
  • Accessibility Inspector 是 Xcode 内置工具,从 Open Developer Tool 或 Spotlight 启动,用于检查任何 view 的无障碍属性。
  • “Perform accessibility audits for your app”(WWDC23)介绍了在 UI test 中集成无障碍审计的详细方法。
Swift 开发工具