Highlight
Xcode 15 重新设计了 Test Report,通过自动识别失败模式、交互式 UI 测试回放和热力图视图,将定位测试失败根因的时间从手动翻查日志缩短到几分钟。
核心内容
你的项目有上千个测试,跑在多种语言配置和多个设备上。某个 CI 构建失败了,你面对的是一个庞大的测试矩阵——哪个失败是共性问题?哪个是设备特有?从哪开始查?
Xcode 15 的 Test Report 就是为解决这个痛点设计的。
(00:19)Test Report 统一展示本地测试、Xcode Cloud CI 测试和远程机器测试的结果。无论测试规模大小,从单个调试测试到数千个 CI 测试,都在同一个界面中组织。
测试结构回顾
(01:03)Xcode 的测试层级从下到上是:Test Method(单个测试方法)→ Test Class(测试类)→ Test Bundle(测试包,Unit 或 UI)→ Test Plan(测试计划)。Test Plan 可以包含多个 Bundle,并配置多种运行条件(Configuration)和设备(Run Destination)。
(03:11)演讲者以多语言支持为例:Test Plan 配置了英语、法语、日语等语言 Configuration,同时在 iPhone 14、iPhone 14 Pro、iPad 三个设备上运行。每个”测试方法 + 配置 + 设备”的组合产生一个 Test Method Run,形成一个完整的测试结果矩阵。
Test Summary:一眼看清全局
(05:57)Test Summary 提供测试运行的整体概览:
- 测试环境信息:显示运行配置、设备列表、测试计划特征(如重复测试次数、性能指标采集)
- 热力图(Heat Map):在多设备多配置的矩阵中用颜色直观展示哪些组合通过、哪些失败
- 失败快速入口:直接列出所有失败测试,无需展开层级翻找
(07:05)热力图的颜色和计数帮助快速对比不同运行之间的表现。如果某个设备在所有配置下都失败,问题很可能出在设备环境而非代码逻辑。
Insights:自动发现失败模式
(06:11)Insights 是 Test Report 的核心亮点,自动分析所有配置和设备上的测试结果,发现隐藏模式:
Common Failure Patterns(常见失败模式)
(06:32)Xcode 自动将失败消息相似的测试分组。演讲者的例子中,3 个测试因为相似的失败消息被归为一组。点击 Insight 后可以看到:共同的失败消息、涉及哪些测试、在哪些配置和设备上发生。
(08:01)这种分组直接给出修复优先级——解决一个共性问题,可能修复多个测试。
Longest Test Runs(最长测试运行)
(06:42)列出耗时最长的测试,帮助识别性能瓶颈。测试套件整体变慢时,从这里入手最有效。
Test Details:单个测试的专属调试空间
(08:12)点击某个 Test Method Run 进入 Test Details 视图,这是专注于单个测试结果的调试空间。
对于 Unit Test:
- 跨所有配置和设备的运行结果对比
- 失败消息和调用栈(Call Stack)
- 调用栈中的入口可直接跳转到源代码
对于 UI Test,调试能力更强:
(09:50)UI Test 的 Test Details 包含三个区域:
Test Activity(测试活动)
时间线格式展示测试从开始到结束的每个事件。顶部是测试起点,底部是终点,中间每一行代表一个操作事件。
Automation Explorer(自动化浏览器)
(10:17)与 Test Activity 联动的视频回放区域。点击时间线上的任意事件,Automation Explorer 显示对应时刻的屏幕截图,可完整回放整个测试过程。
Scrubber(时间轴)
(10:25)测试运行的线性时间轴,标注了点击、滑动、旋转等交互事件。失败图标标记了失败发生的精确位置,帮助快速定位问题时刻。
(11:46)点击 UI 元素上的边界框,可以查看该元素的标识符(Identifier)和层级信息(Hierarchy)。演讲者的例子中,“Account”按钮明明可见,但测试找不到它——通过查看元素信息发现是标签写错了。
详细内容
配置多语言测试矩阵
(02:19)在 Test Plan 的 Configurations 中设置不同语言和地区:
Test Plan: Backyard Birds
├── Configuration: English (US)
├── Configuration: French (FR)
├── Configuration: Japanese (JP)
└── Run Destinations: iPhone 14, iPhone 14 Pro, iPad
关键点:
- 每个 Configuration 会独立运行完整测试套件
- 结合多个 Run Destination,形成完整的测试覆盖矩阵
- 适合验证国际化、本地化、区域格式(日期、数字、货币)的正确性
利用 Insights 优先处理共性问题
(07:34)看到 Insights 显示”3 个测试共享相似的失败消息”时,处理流程:
- 点击 Insight 查看共同失败消息
- 查看涉及哪些测试方法和类
- 查看在哪些配置/设备上发生
- 如果跨所有配置都失败 → 代码逻辑问题
- 如果只在特定配置上失败 → 本地化或环境问题
(08:07)演讲者的 3 个失败测试都因为同一个 API 返回异常,修复一处即可同时解决 3 个测试失败。
UI 测试调试实战
(09:39)UI Test 失败时的调试步骤:
- 在 Test Summary 中点击失败项进入 Test Details
- 默认进入 Activities 标签页
- 在时间线中找到标红的失败事件
- 查看 Automation Explorer 中失败时刻的截图
- 检查 Scrubber 确认失败前的交互序列
- 点击目标 UI 元素的边界框查看 identifier 和 accessibility 信息
- 对比代码中的查询条件与实际元素属性
(12:12)演讲者发现按钮的 accessibility label 在代码中写的是 “Account”,但实际元素显示的是 “Settings”——标签不匹配导致 XCTAssert 找不到元素。
本地与 CI 的统一体验
(12:27)Test Report 在 Xcode IDE 和 Xcode Cloud 中提供一致的界面。本地调试时复现的问题,在 CI 中可以用同样的方式分析;CI 发现的失败,本地也能用相同的工具链排查。
核心启发
1. 建立多配置 CI 测试门禁
- 做什么:在 Xcode Cloud 工作流中配置多语言、多设备的 Test Plan,每次 PR 自动运行
- 为什么值得做:Insights 的 Common Failure Patterns 能在失败发生的第一时间指出共性问题,避免问题合并到主分支
- 怎么开始:在 Test Plan 中添加 Language/Region Configuration,Xcode Cloud 工作流中关联该 Test Plan
2. 用热力图识别设备特有问题
- 做什么:定期查看 Test Summary 中的热力图,寻找”某个设备系统性失败”的模式
- 为什么值得做:设备特有问题通常是环境或适配问题,与代码逻辑无关,热力图的颜色分布一眼就能区分
- 怎么开始:在 Test Plan 中配置多个 Run Destination,CI 运行后查看热力图的列(设备维度)
3. 优化慢测试提升 CI 效率
- 做什么:利用 Longest Test Runs Insight 找出耗时最长的测试,针对性优化或拆分
- 为什么值得做:CI 构建时间直接影响开发效率,一个耗时 30 秒的测试如果被拆成 3 个 10 秒的测试,并行运行可以显著缩短总时间
- 怎么开始:查看 Insights 中的 Longest Test Runs 列表,对排名靠前的测试进行性能分析
4. 用 UI Test 回放定位偶现 Bug
- 做什么:对容易偶现失败的 UI Test,利用 Automation Explorer 的视频回放和 Scrubber 时间轴分析失败前序操作
- 为什么值得做:偶现 Bug 最难复现,Test Report 自动录制了完整的测试过程,无需手动复现
- 怎么开始:在 UI Test 中确保测试步骤清晰,失败后在 Test Details 的 Activities 标签页逐帧查看
关联 Session
- What’s new in Xcode 15 — Xcode 15 新功能总览,包含 Test Report 的上下文
- Xcode Cloud — CI/CD 持续集成,Test Report 在云端的使用场景
- Demystify SwiftUI performance — 性能测试与分析方法
- Beyond the basics of structured concurrency — 并发代码的测试策略
评论
GitHub Issues · utterances