关于 compare-test-runs
借助 Tuist CLI 对比两次测试运行的技能,适用于需要评估代码变更对测试结果影响的开发者。它汇总整体指标、模块与套件结果、失败和波动测试,并指导检查错误详情与附件。
主要功能
- 01解析测试运行标识或分支
- 02比较状态、耗时与测试数量
- 03按模块和套件检查结果
- 04分类失败、修复与波动测试
- 05检查失败详情及附件
适用场景
- 01评估分支变更是否引入测试回归
- 02定位新失败或新增波动测试
- 03检查测试运行耗时变化
- 04整理失败证据并提出后续建议
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ tuist/ agent-skills --skill compare-test-runs安装后在 Claude Code 中输入/compare-test-runs确认已加载。
详细介绍
比较测试运行
快速开始
通常会收到两个测试运行标识符。请按以下步骤操作:
- 分别对 base 和 head 测试运行执行
tuist test show <id> --json。 - 执行
tuist test module list <test-run-id> --json和tuist test suite list <test-run-id> --json,获取模块和测试套件明细。 - 执行
tuist test case run list <identifier> --json,获取各个测试用例的结果。 - 比较失败、易波动测试、耗时和整体状态。
- 使用
tuist test case run show <id> --json检查失败的测试用例。 - 总结发现并提出可执行的建议。
第 1 步:解析测试运行
如果 base/head 是测试运行 ID 或仪表板 URL
直接获取:
tuist test show <base-id> --json
tuist test show <head-id> --json
如果 base/head 是分支名称
列出每个分支上最近的测试运行,以确定测试运行 ID:
tuist test list --git-branch <base-branch> --json --page-size 5
tuist test list --git-branch <head-branch> --json --page-size 5
从每个分支的结果中选取最新的测试运行 ID。
默认值
- 如果未提供 base,则使用项目的默认分支(通常为
main)。 - 如果未提供 head,则检测当前 git 分支。
第 2 步:比较顶层指标
获取两个测试运行后,比较以下内容:
| 指标 | 检查内容 |
|---|---|
status | 如果 base 通过而 head 失败,则标记 |
duration | 如果 head 耗时增加超过 10%,则标记 |
total_test_count | 注意测试数量是否变化(新增或移除测试) |
failed_test_count | 比较失败数量 |
flaky_test_count | 比较易波动测试数量 |
avg_test_duration | 标记显著变化 |
第 3 步:获取模块和测试套件明细
获取两个测试运行的模块和测试套件级结果,了解哪些部分出现退化:
tuist test module list <base-test-run-id> --json
tuist test module list <head-test-run-id> --json
tuist test suite list <base-test-run-id> --json
tuist test suite list <head-test-run-id> --json
根据名称匹配两个运行中的模块和测试套件,以确定哪些部分出现新增失败或耗时退化。
第 4 步:获取各个测试用例的结果
获取两个测试运行的测试用例运行结果:
tuist test case run list <identifier> --json --page-size 100
根据 name + module_name + suite_name 匹配两个运行中的测试用例。
第 5 步:分类变化
将测试用例分为以下类别:
- 新增失败:在 base 中通过、但在 head 中失败的测试。
- 已修复测试:在 base 中失败、但在 head 中通过的测试。
- 新增易波动测试:在 base 中不易波动、但在 head 中易波动的测试。
- 不再易波动:在 base 中易波动、但在 head 中稳定的测试。
- 新增测试:在 head 中存在、但在 base 中不存在的测试。
- 已移除测试:在 base 中存在、但在 head 中不存在的测试。
- 耗时退化:耗时增加超过 50% 的测试。
第 6 步:检查失败
对于每个新增失败,获取详细信息:
tuist test case run show <test-case-run-id> --json
需要检查的关键字段:
failures[].message-- 断言或错误消息failures[].path-- 源文件路径failures[].line_number-- 失败的确切行号failures[].issue_type-- 问题类型repetitions-- 如果存在,则显示重试行为(易波动检测)crash_report-- 测试运行器崩溃时的崩溃数据
第 7 步:检查附件
tuist test case run show 的输出包含附件和崩溃报告信息。请检查:
- 截图或 UI 测试产物
- 日志文件或崩溃报告
- 附加到失败运行的任何诊断数据
总结格式
请按以下内容生成总结:
- 总体结论:与 base 相比,情况更好、更差或没有变化。
- 新增失败:逐项列出,并附上失败消息、文件路径和行号。
- 新增易波动测试:列出测试并说明易波动情况。
- 已修复测试:列出现在已通过的测试。
- 耗时:整体耗时及值得注意的单项测试退化情况。
- 建议:针对每个问题提出可执行的后续步骤。
示例:
Test Run Comparison: base (run-123 on main) vs head (run-456 on feature-x)
Status: success -> failure -- REGRESSION
Duration: 120.5s -> 145.2s (+21%)
Tests: 342 -> 345 (3 new tests)
Failures: 0 -> 2 (2 new failures)
Flaky: 1 -> 3 (2 newly flaky)
New Failures:
1. AuthModuleTests/LoginTests/test_login_with_expired_token
Message: "Expected status 401, got 500"
File: Tests/AuthModuleTests/LoginTests.swift:42
Likely cause: Server error handling changed for expired tokens
2. NetworkTests/RetryTests/test_retry_on_timeout
Message: "Timed out waiting for retry"
File: Tests/NetworkTests/RetryTests.swift:87
Likely cause: Timeout threshold too low after network layer refactor
Newly Flaky:
1. CacheTests/WriteCacheTests/test_concurrent_writes (flaky in 3/5 runs)
Recommendations:
- Fix expired token handling in AuthModule
- Increase timeout in RetryTests or mock the network layer
- Investigate concurrent write synchronization in CacheTests
完成检查清单
- 已解析 base 和 head 测试运行
- 已比较顶层指标
- 已获取两个运行的模块和测试套件明细
- 已确定新增失败、已修复测试和易波动变化
- 已检查新增失败的详细信息
- 已提供包含文件路径的可执行建议
评论
支持 Markdown