name: test description: 全面测试工作流 - 单元测试 ∥ 集成测试 → E2E测试
/test - 测试工作流
运行全面的测试套件,支持并行执行。
何时使用
- “运行所有测试”
- “测试功能”
- “验证一切正常”
- “完整测试套件”
- 发布或合并前
- 重大更改后
工作流概览
┌─────────────┐ ┌───────────┐
│ 诊断 │ ──▶ │ 仲裁器 │ ─┐
│ (类型检查) │ │ (单元测试)│ │
└─────────────┘ └───────────┘ │
├──▶ ┌─────────┐
┌───────────┐ │ │ 阿特拉斯│
│ 仲裁器 │ ─┘ │ (E2E测试)│
│ (集成测试)│ └─────────┘
└───────────┘
预检阶段 并行执行 顺序执行
(~1秒) 快速测试 慢速测试
代理序列
| # | 代理 | 角色 | 执行方式 |
|---|---|---|---|
| 1 | arbiter | 单元测试、类型检查、代码规范 | 并行 |
| 1 | arbiter | 集成测试 | 并行 |
| 2 | atlas | E2E/验收测试 | 在阶段1通过后执行 |
为何按此顺序?
- 快速反馈:单元测试快速失败
- 并行效率:单元和集成测试之间无依赖
- E2E门控:仅在快速测试通过后运行缓慢的E2E测试
执行
阶段0:预检诊断(新)
运行测试前,检查类型错误 - 它们常导致测试失败:
tldr diagnostics . --project --format text 2>/dev/null | grep "^E " | head -10
为何先诊断?
- 类型检查即时(约1秒),测试更耗时
- 诊断显示根本原因,测试显示症状
- "预期int,得到str"比"第50行AttributeError"更清晰
- 捕获未测试代码路径的错误
如果发现错误: 在运行测试前修复它们。类型错误通常意味着测试会失败。
如果干净: 进入阶段1。
阶段0.5:变更影响(可选)
对于大型测试套件,仅查找受影响的测试:
tldr change-impact --session
# 或指定文件:
tldr change-impact src/changed_file.py
这返回基于更改应运行的测试。对于小型项目或需要全覆盖时跳过。
阶段1:并行测试
# 并行运行两者
Task(
subagent_type="arbiter",
prompt="""
为范围运行单元测试:[SCOPE]
包括:
- 单元测试
- 类型检查
- 代码规范
报告:通过/失败计数,失败详情
""",
run_in_background=true
)
Task(
subagent_type="arbiter",
prompt="""
为范围运行集成测试:[SCOPE]
包括:
- 集成测试
- API测试
- 数据库测试
报告:通过/失败计数,失败详情
""",
run_in_background=true
)
# 等待两者
[检查两个TaskOutput]
阶段2:E2E测试(如果阶段1通过)
Task(
subagent_type="atlas",
prompt="""
为范围运行E2E测试:[SCOPE]
包括:
- 端到端流程
- 验收测试
- UI测试(如适用)
报告:通过/失败计数,失败时截图
"""
)
测试范围
完整套件
用户:/test
→ 所有单元 + 集成 + E2E测试
功能范围
用户:/test authentication
→ 仅与认证相关的测试
快速检查
用户:/test --quick
→ 仅单元测试(跳过集成和E2E)
示例
用户:/test 新支付功能
Claude:开始/test工作流,用于支付功能...
阶段0:预检诊断...
$ tldr diagnostics . --project --format text | grep "^E "
(未发现类型错误)
阶段1:运行并行测试...
┌─────────────────────────────────────────┐
│ arbiter:运行单元测试... │
│ arbiter:运行集成测试... │
└─────────────────────────────────────────┘
arbiter:✅ 45/45 单元测试通过
arbiter:✅ 12/12 集成测试通过
阶段2:运行E2E测试...
atlas:✅ 8/8 E2E测试通过
测试总结:
┌─────────────┬─────────┬────────┐
│ 类型 │ 通过 │ 失败 │
├─────────────┼─────────┼────────┤
│ 单元 │ 45 │ 0 │
│ 集成 │ 12 │ 0 │
│ E2E │ 8 │ 0 │
├─────────────┼─────────┼────────┤
│ 总计 │ 65 │ 0 │
└─────────────┴─────────┴────────┘
所有测试通过!✅
类型错误示例
用户:/test
Claude:开始/test工作流...
阶段0:预检诊断...
$ tldr diagnostics . --project --format text | grep "^E "
E src/payment.py:45:12: 参数类型'str'不可分配给'int'
E src/refund.py:23:8: 返回类型'None'不可分配给'float'
发现2个类型错误。运行测试前修复...
[Claude修复类型错误]
重新运行诊断... 干净。
阶段1:运行并行测试...
失败处理
如果阶段1失败:
arbiter:❌ 43/45 测试通过
2个失败:
- test_payment_validation:预期'invalid'得到'valid'
- test_refund_calculation:偏差0.01美元
停止工作流。运行E2E测试前修复失败。
标志
--quick:仅单元测试--no-e2e:跳过E2E测试--coverage:包括覆盖率报告--watch:文件更改时重新运行