Developer Tools 进阶 20m
更快获取测试结果
Get your test results faster
2020年6月23日
一句话判断
如果你的测试套件跑一次要等半小时,这场 Session 就是为你准备的——Xcode 12 在测试并行执行和结果报告上的改进能让你的反馈循环大幅缩短。
这场 Session 讲了什么
这场 Session 的核心主题是如何让开发者更快地获取测试结果。演讲者从测试执行的完整生命周期切入,分析了时间都花在了哪里:编译、部署、启动模拟器、执行测试、收集结果。Xcode 12 在多个环节都做了优化。
首先是测试并行执行的改进。Xcode 12 可以在多个模拟器上同时运行测试,更好地利用多核 CPU 资源。演讲者详细解释了如何配置 parallel testing,包括 worker 数量的选择、测试分片策略(test splitting),以及如何处理共享状态导致的测试冲突。
其次是测试结果报告的增强。Xcode 12 的测试报告中加入了更详细的计时信息,你可以清楚地看到每个测试用例的耗时分布,快速定位慢测试。对于 UI 测试,报告中还包含了截图和视频片段,方便你直观理解测试失败的原因。
最后,演讲者介绍了一些测试编写的最佳实践,帮助你写出跑得更快的测试——比如减少不必要的 setup/teardown、合理使用 mock 而非端到端测试、以及如何利用 XCTestPlan 组织不同粒度的测试集。
值得深挖的点
- 测试分片的公平性:Xcode 默认按 bundle 均匀分配测试到 worker,但这不一定最优。如果某个 bundle 包含大量慢测试,分配到它的 worker 就会成为瓶颈。解决方案是拆分大 bundle 或手动配置测试分配策略。
- XCResult 的结构化数据:XCResultBundle 不再只是一个日志文件,它是一个结构化的数据库。你可以用
xcrun xcresulttool命令行工具或开源的 XCResultKit 解析它,集成到 CI/CD pipeline 中自动生成测试报告。
代码片段
// 在 XCTestPlan 中配置并行测试
// 通过 xcodebuild 命令行启用
// -parallel-testing-enabled YES
// -parallel-testing-worker-count 4
// 命令行示例:
// xcodebuild test \
// -scheme MyApp \
// -destination 'platform=iOS Simulator,name=iPhone 11' \
// -parallel-testing-enabled YES \
// -parallel-testing-worker-count 4
// 使用 XCTestPlan 管理不同测试配置
// 在 Xcode 中创建 .xctestplan 文件
// 配置:
// - Unit Tests: 快速,并行执行
// - UI Tests: 慢速,串行执行
// - Smoke Tests: 精选用例,用于 PR 验证
// 用 measure block 替代手动性能测试
func testParsingPerformance() {
measure {
let parser = JSONParser()
_ = parser.parse(sampleData)
}
}
// 解析 XCResult 获取测试耗时
// 命令行:
// xcrun xcresulttool get test-results summary \
// --path TestResults.xcresult
// 在 CI 中使用 xcparse 提取失败截图
// xcparse screenshots \
// --output ./failure-screenshots \
// TestResults.xcresult
最佳实践
- 将单元测试和 UI 测试分开配置——前者并行跑,后者根据稳定性决定是否并行
- 使用
measureblock 代替手动计时的性能测试,Xcode 会自动建立 baseline 和回归检测 - CI 中用
xcodebuild的-resultBundlePath参数导出结构化结果,配合 xcparse 等工具生成报告 - 定期清理不再需要的测试,减少测试套件的总执行时间
- 把最可能失败的测试放在前面跑,这样能更快获得有价值的反馈
还有什么值得关注
- Xcode Cloud(后来的产品)进一步简化了测试并行化的配置
- Swift Package Manager 的测试支持也在不断改进,对 SPM 项目来说测试速度提升更明显
- 搭配 “Handle interruptions and alerts in UI tests” 一起看,可以建立更健壮的测试基础设施
WWDC 2020