用途
axiom-ui-testing 用于指导编写稳定、可维护的 UI 测试,重点解决测试中的竞态条件、时序依赖和结果不一致问题。其核心原则是:等待条件,而不是猜测操作需要多长时间。任意超时(如 sleep)是测试不稳定的主要来源,基于条件的等待可以消除竞态条件。
该技能面向以下典型问题:
- UI 测试在本地 Mac 上通过,但在 CI 中失败(设备与速度差异导致的时序差异)。
- 测试有时通过、有时失败(竞态条件)。
- 测试使用 sleep(2)、sleep(5) 等任意延迟,仍然不稳定。
- 测试报“UI 元素未找到”,重试后又通过。
- 测试在 iPhone 上通过,在 iPad 上失败(跨设备尺寸差异)。
- 使用 Xcode 26 的 Recording UI Automation 录制测试后,需要回看视频并调试失败。
主要能力
基于条件的等待
技能提供多种等待模式:
- 等待元素出现:使用
waitForExistence(timeout:),而不是sleep()。 - 等待元素消失:使用
XCTNSPredicateExpectation配合exists == false谓词。 - 等待特定状态:例如等待按钮变为可用(
isEnabled == true)。 - 网络请求延迟:等待加载指示器消失后再验证数据。
- 动画处理:等待目标视图出现,必要时才额外等待动画稳定。
可访问性优先
技能强调使用 accessibility identifier 而非硬编码文本标签,因为标识符不随本地化变化,且在 UI 更新中保持稳定。示例包括 SwiftUI 的 .accessibilityIdentifier("submitButton") 与 UIKit 的 button.accessibilityIdentifier = "submitButton"。对于动态内容,建议使用实例化标识符(如 landmark-\(landmark.id))。
快速决策树
技能给出排查路径:元素未找到时使用 waitForExistence;本地通过但 CI 失败时用条件轮询替换 sleep;动画导致问题时等待动画完成而非禁用动画;网络请求时序问题使用 XCTestExpectation 或 waitForExistence。
Recording UI Automation(Xcode 26 新增)
分为三个阶段:
- 录制:将点击、滑动、硬件按钮等交互捕获为 Swift 代码。
- 回放:跨多设备、语言、地区、方向运行。
- 回看:观看视频录制、分析失败、查看 UI 元素叠加层。
支持平台包括 iOS、iPadOS、macOS、watchOS、tvOS 以及 Designed for iPad 的 visionOS。
高级自动化 API
技能覆盖设备状态设置(方向、外观模式、模拟位置)、启动参数与环境变量、自定义 URL Scheme 打开应用、在测试中执行可访问性审计(performAccessibilityAudit),以及使用 Test Plans 管理多语言、多地区配置和截图/视频捕获设置。
使用方式
- 为所有交互元素添加 accessibility identifier,避免硬编码标签。
- 在 Xcode 中创建 UI Testing Bundle 目标。
- 使用 Xcode 26 的“Start Recording”按钮录制交互,生成 Swift 测试代码。
- 录制后审查每行查询,优先选择最短、最稳定的查询方式(标识符优先)。
- 添加断言:使用
waitForExistence、wait(for:toEqual:timeout:)等验证预期行为。 - 在本地运行测试 10 次以捕获不稳定性,并在最慢的支持设备和 CI 环境中运行。
- 使用 Test Plans 配置多语言、多地区、外观模式等测试矩阵。
适用场景
- 编写新的 UI 测试。
- 录制交互并生成测试代码。
- 排查测试中的竞态条件、时序依赖和不一致通过/失败行为。
- 将 XCTest UI 测试迁移到更可靠的等待模式。
- 跨设备、跨语言、跨地区的 UI 测试。
- 通过视频回看调试失败的 UI 测试。
限制
- 技能内容主要面向 Apple 平台(iOS、iPadOS、macOS、watchOS、tvOS、visionOS)与 Xcode 工具链。
- Recording UI Automation 需要 Xcode 26。
- UI 自动化独立于应用运行,无法直接访问应用模型或数据。
- 技能未提供具体的收费、价格或平台授权信息。
- 技能未提供安装命令或包管理信息。