SuperAPI AI 工具集

qa-testing-ios

测试与质量

查看项目

更新于 10-15 15:25

技能介绍

用途

QA Testing (iOS) 是一个面向 iOS 测试执行与不稳定用例(flake)控制的高信号技能,覆盖 XCTest、XCUITest、Swift Testing、xcodebuild、xcresult 和 simctl。当工作属于原生 iOS 重写或 Codex / Claude Code 实现循环的一部分时,建议与 software-ios-native 搭配使用。

主要能力

  • 提供 iOS 测试工作流:先解析构建输入(workspace 或 project、scheme、test plan、destination、启动钩子),再让环境可重复(模拟器启动、权限、locale、region、应用状态重置)。
  • 提供默认策略:新单元与集成测试优先使用 Swift Testing(除非项目已标准化为 XCTest);UI 与性能测试继续使用 XCTest/XCUITest;PR 门禁使用轻量模拟器冒烟覆盖并始终启用 xcresult 产物;仅在硬件行为重要时增加真机验证。
  • 提供 xcodebuild 命令模式:枚举测试、单测目标、并行测试、受控重试、本地证明 flake 等。
  • 提供 flake 控制方法:优先使用 waitForExistence、expectations 和基于状态的断言而非 sleep;在允许时禁用或减少动画;桩化或重定向第三方边界;测试间重置权限与应用状态;locale 影响断言时固定 -testLanguage 与 -testRegion;使用测试计划做矩阵覆盖;保持 UI 套件精简。
  • 提供测试计划组织建议:Smoke 计划(PR 门禁)、Full 计划(夜间或候选发布)、Locale 计划(不同语言/区域覆盖)。
  • 提供确定性 E2E 夹具:对认证、引导、计费等后端耦合流程,优先使用夹具支持的启动环境而非真实凭据,将 .accessibilityIdentifier() 字符串视为测试契约的一部分。
  • 提供本地化与视觉回归验证:检查键存在与翻译值质量,对德语、俄语、日语、阿拉伯语等高风险 locale 做窄宽度视觉冒烟。
  • 提供脚本 scripts/xcresult_to_junit.py:将 .xcresult 转换为 JUnit XML(Xcode 16+,fixtures 来自 Xcode 27;仅用标准库),统计 Test Case 节点,从子节点读取失败,若计数与 xcresulttool get test-results summary 不一致则退出码 4。
  • 提供模板 assets/template-ios-ui-test-stability-checklist.md:UI 测试确定性审查清单。

使用方式

快速开始命令包括:

  • xcodebuild -list -workspace MyApp.xcworkspace(列出 schemes)
  • xcodebuild -scheme MyApp -showdestinations(显示有效目标)
  • xcodebuild -scheme MyApp -showTestPlans(显示可用测试计划)
  • xcrun xctrace list devices(列出物理与模拟器设备)
  • xcrun simctl list devices available(列出可用模拟器)
  • xcrun simctl boot "<simulator-name>"(启动模拟器)
  • xcrun simctl bootstatus booted -b(等待启动完成)
  • xcrun simctl uninstall booted <bundle-id>(冒烟前移除陈旧安装)
  • xcodebuild test -scheme MyApp -destination 'platform=iOS Simulator,name=<simulator-name>,OS=latest' -resultBundlePath TestResults.xcresult(在模拟器运行测试)
  • xcodebuild test -scheme MyApp -destination 'platform=iOS,id=<UDID>' -resultBundlePath TestResults.xcresult(在设备运行测试)
  • xcodebuild build-for-testing ... 然后 xcodebuild test-without-building ...(更快重跑)
  • xcrun xcresulttool get test-results summary --path TestResults.xcresult(通过/失败与计数)
  • xcodebuild ... -destination "generic/platform=iOS" build(仅编译构建)
  • xcodebuild archive -scheme MyApp -destination 'generic/platform=iOS' -archivePath MyApp.xcarchive(演练归档/签名路径)

工作流要点:先解析构建输入;让环境可重复;若任务依赖当前二进制是否真的在屏幕上,先做全新卸载/安装/启动冒烟;若模拟器截图路径缺失或过期,视为工具产物而非无证据;若涉及推送、购买、深链等分发渠道行为,将传输证明与用户可见结果证明分开,必要时使用真机验证;保持编译、测试、归档、安装/启动、TestFlight 和用户旅程证据彼此独立;启用产物运行;先从 xcresult 分诊,再用 -only-testing 复现单个失败测试;若 CoreSimulatorService 返回“Connection refused”,停止重试同一目标,改用 generic/platform=iOS 做仅编译证明;将 rerun-pass 视为需要归属和根因修复的 flake。

适用场景

  • 选择测试目标设备(模拟器、真机或两者)。
  • 控制不稳定测试(flake)。
  • 解析测试产物(xcresult、覆盖率、截图、日志、诊断)。
  • 组织测试计划做矩阵覆盖。
  • 为后端耦合流程构建确定性 E2E 夹具。
  • 本地化与视觉回归验证。
  • 在 CI 环境(本地、GitHub Actions、Xcode Cloud 或自托管 macOS)中运行 iOS 测试。

限制

  • 当功能依赖分发签名、真实硬件、APNs、相机、生物识别、购买或后台执行时,不得将模拟器通过或归档通过视为完整 iOS 发布证明。
  • 模拟器或显式未签名构建不演练设备签名;开发签名的设备构建可证明该目标的开发签名,但不证明分发签名、导出、TestFlight 处理或发布产物可安装性。
  • 归档通过本身不证明导出、安装或启动;模拟器通过不证明 APNs、StoreKit、entitlements、后台模式、相机、生物识别或其他设备/渠道行为。
  • 跨框架断言可能因互操作模式丢失失败;不能假设测试发现意味着断言兼容。
  • 采用 iOS 26 SDK 后,需将现有快照基线对照 Liquid Glass 渲染比较并重新生成受影响基线,接受前审查每个差异。
  • 若核心问题是陈旧安装、模拟器漂移、.app 包格式错误、可执行文件缺失或安装/启动失败,应转向 software-ios-runtime-debugging。
  • 若涉及产品架构、应用实现、SwiftUI 重写或 Xcode 代理工作流,应使用 software-ios-native。
  • 若涉及跨平台移动测试策略,应使用 qa-testing-mobile;若涉及发布级质量策略,应使用 qa-testing-strategy。
  • 项目特定的发布流程、后端端点、测试账号清理和内部运行手册不应放入此可移植核心,应放在项目文档或限定引用中。
  • 关于 AI 原生测试工具(如 Maestro MCP 等)的供应商能力声明变化很快,推荐前需对照供应商当前文档核实。