WWDC Quick Look 💓 By SwiftGGTeam
Fix failures faster with Xcode test reports

Fix failures faster with Xcode test reports

观看原视频

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 个测试共享相似的失败消息”时,处理流程:

  1. 点击 Insight 查看共同失败消息
  2. 查看涉及哪些测试方法和类
  3. 查看在哪些配置/设备上发生
  4. 如果跨所有配置都失败 → 代码逻辑问题
  5. 如果只在特定配置上失败 → 本地化或环境问题

08:07)演讲者的 3 个失败测试都因为同一个 API 返回异常,修复一处即可同时解决 3 个测试失败。

UI 测试调试实战

09:39)UI Test 失败时的调试步骤:

  1. 在 Test Summary 中点击失败项进入 Test Details
  2. 默认进入 Activities 标签页
  3. 在时间线中找到标红的失败事件
  4. 查看 Automation Explorer 中失败时刻的截图
  5. 检查 Scrubber 确认失败前的交互序列
  6. 点击目标 UI 元素的边界框查看 identifier 和 accessibility 信息
  7. 对比代码中的查询条件与实际元素属性

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

评论

GitHub Issues · utterances