Xcode 选择性测试

仅运行与变更集相关的测试。

观看视频

Swift

这是什么?

“所谓疯狂,就是一遍又一遍地重复做同一件事,却期待不同的结果。”

阿尔伯特·爱因斯坦,大概是吧

假设我们有以下依赖结构

如果 📦Login 模块被更改,它只会影响 📦LoginUI📱MainApp

如果我们知道只有 📦Login 模块被更改,那么测试所有模块有意义吗?没有意义。我们只需运行 50% 的测试即可获得相同的结果。

这项技术可以节省本地和 CI 测试的时间。

test-changed-stats-build

先决条件

安装

Xcode

作为 SPM 依赖项添加到 Xcode。

或者,您可以使用该工具的预构建二进制版本,该版本在 releases 部分分发。

使用 Swift Package Manager

.package(url: "git@github.com:mikeger/XcodeSelectiveTesting", .upToNextMajor(from: "0.11.2")) 添加到您的 Package.swiftdependencies 部分。

使用 SPM 运行命令:swift run xcode-selective-test

或者,您可以使用该工具的预构建二进制版本,该版本在 releases 部分分发。

使用 Mint

mint install mikeger/XcodeSelectiveTesting@0.11.2

手动

集成

用例:基于 Swift Package Manager 的设置

如果您在使用 Swift Package Manager 而没有 Xcode 项目或工作区

运行 swift test --filter "$(swift run xcode-selective-test . --json | jq -r ". | map(.name) | join(\"|\")")"

注意:此命令假定您已安装 jq 工具。您可以使用 Homebrew 通过 brew install jq 安装它。

用例:基于 Xcode 的项目,在本地运行测试

  1. 安装该工具(请参阅 安装:Xcode
  2. 在 Xcode 的文件列表中选择您的项目
  3. 右键单击它并选择 SelectiveTestingPlugin
  4. 等待工具运行
  5. 正常运行测试,SelectiveTesting 将根据本地更改修改您的测试计划

或者,您可以使用 CLI 来达到相同的结果

  1. 运行 mint run mikeger/XcodeSelectiveTesting@0.11.2 YourWorkspace.xcworkspace --test-plan YourTestPlan.xctestplan
  2. 正常运行测试,XcodeSelectiveTesting 将根据本地更改修改您的测试计划

用例:基于 Xcode 的项目,在 CI 上执行测试,没有测试计划

  1. 添加代码以安装该工具
  2. 使用 xcodebuild 仅运行选定的测试:xcodebuild test -workspace Workspace.xcworkspace -scheme Scheme $(mint run --silent XcodeSelectiveTesting@provide-if-target-is-test-target --json | jq -r "[.[] | select(.testTarget == true)] | map(\"-only-testing:\" + .name) | join(\" \")")

用例:基于 Xcode 的项目,在 CI 上执行测试,带有测试计划

  1. 添加代码以安装该工具
  2. 在执行测试之前添加 CI 步骤:mint run mikeger/XcodeSelectiveTesting@0.11.2 YourWorkspace.xcworkspace --test-plan YourTestPlan.xctestplan --base-branch $PR_BASE_BRANCH
  3. 执行您的测试

用例:GitHub Actions,其他 git 仓库形状不适合直接提供变更集的情况

  1. 添加代码以安装该工具
  2. 收集已更改文件的列表
  3. 通过命令行选项 -c--changed-files 提供已更改文件的列表

这是如何工作的?

1. 检测到什么被更改

Git 允许我们找到变更集中修改了哪些文件。

Root
├── Dependencies
│   └── Login
│   ├── ❗️LoginAssembly.swift
│   └── ...
├── MyProject.xcodeproj
└── Sources

2. 构建依赖关系图

从项目到其依赖项,到其依赖项的依赖项,到依赖项的依赖项,...

包之间的依赖关系可以使用 swift package dump-package 解析,Xcode 项目和目标之间的依赖关系可以使用 XcodeProj 解析。

顺便说一句,这是您在 Leetcode 图形练习中获得回报的时刻

2.5. 保存每个依赖项的文件列表

这很重要,这样我们就会知道哪些文件影响哪些目标。

3. 遍历图

从每个已更改的依赖项一直向上遍历,并保存您已触及的依赖项集合。

4. 在 scheme / 测试计划中禁用可以跳过的测试

这是最难的部分:处理晦涩难懂的 Xcode 格式。但是,如果我们走到那一步,我们将不会被 10 年前的 XML 吓倒。

命令行选项

配置文件 .xcode-selective-testing.yml

可以在单独的文件中定义配置。该工具将在当前目录中查找此文件。

可用的选项有(示例请参阅 selective-testing-config-example.yml

支持

支持的操作系统

贡献

欢迎贡献。如果您计划贡献,请考虑查看现有问题并创建一个新问题。

许可证

请参阅 LICENSE

作者

贡献者

如果您喜欢这款产品,请考虑向我的家乡慈善项目 Monsters Corporation 捐款 🤝