关于 bazel-test-hygiene
为 workerd 贡献者制定严格的 Bazel 测试规范,强调禁用结果缓存、避免用筛选标志运行单个用例、运行完整测试套件,并对回归测试进行红绿验证。
主要功能
- 01禁用测试结果缓存
- 02避免使用用例筛选标志
- 03运行完整测试套件
- 04执行回归测试红绿验证
适用场景
- 01获取最新的 Bazel 测试结果
- 02验证变更对整个测试套件的影响
- 03确认回归测试能检测出缺陷
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ cloudflare/ workerd --skill bazel-test-hygiene安装后在 Claude Code 中输入/bazel-test-hygiene确认已加载。
详细介绍
Bazel 测试规范
三条规则
1. 始终禁用缓存
bazel test //... --nocache_test_results
原因: 即使你编辑了源文件,Bazel 的操作缓存仍可能提供过时的测试二进制文件。如果不加上 --nocache_test_results,你可能运行的是旧二进制文件,看到的也是旧结果。这并非假设——它曾在本仓库中导致真实的误报和漏报问题。
始终加上 --nocache_test_results。 不得例外。
2. 保持简单——不要使用筛选标志
不要使用 --test_arg='-f' 或类似的筛选标志来运行单个测试用例。
原因: KJ 测试的 -f 标志在没有匹配任何测试时会静默通过。如果筛选条件拼错,或者测试名称发生变化,bazel 会报告“PASSED”,但实际上没有运行任何测试。这会带来完全错误的信心。
运行完整的测试目标。 如果要检查某个特定测试,请在完整输出中查找它的名称。如果整个测试套件太慢,请运行特定的测试_目标_(例如 //src/workerd/api:streams/standard-test@),而不是在某个目标中筛选部分测试。
3. 宣布完成前运行完整测试套件
单个测试目标通过,并不意味着你没有破坏其他功能。对共享代码(queue.c++、standard.c++、common.h)的修复可能会导致完全不同目录中的测试失败。
宣布任何修复完成前:
bazel test //... --nocache_test_results
检查最终汇总行:Executed N out of N tests: N tests pass. 所有 N 都必须一致。如果有任何测试失败,修复就尚未完成。
回归测试的红绿验证
为修复 Bug 编写回归测试时,你必须验证该测试确实能捕获这个 Bug:
- 绿: 运行
bazel test //... --nocache_test_results——所有测试均通过(修复已生效) - 红: 移除修复,运行
bazel test //... --nocache_test_results——新增的测试必须失败 - 绿: 恢复修复,运行
bazel test //... --nocache_test_results——所有测试再次通过
如果第 2 步通过了(移除修复后测试没有失败),说明测试并未按预期验证问题。请返回并修正测试。
对完整测试套件进行红绿验证,而不只是针对单个目标。这样可以同时发现两个问题:(a)回归测试确实能检测到 Bug;(b)修复不会破坏其他功能。
反面模式
| 不要 | 应该这样做 |
|---|---|
bazel test //target(没有缓存标志) | bazel test //target --nocache_test_results |
--test_arg='-f' --test_arg='test name' | 运行完整目标,并在输出中搜索测试名称 |
| 只运行一个目标就宣布修复完成 | 运行 //...,检查全部通过的汇总信息 |
| 根据之前某次运行宣称“测试通过” | 重新运行,并查看最新输出 |
| 直接相信基于筛选的“PASSED” | 检查输出中是否出现预期的测试名称 |