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 テストの健全性
3 つのルール
1. 常にキャッシュを無効にする
bazel test //... --nocache_test_results
理由: Bazel のアクションキャッシュは、ソースファイルを編集した後でも古いテストバイナリを返すことがあります。--nocache_test_results を指定しないと、古いバイナリを実行して古い結果を見ている可能性があります。これは仮定の話ではありません。このリポジトリで実際に誤検知・見逃しの混乱を招いたことがあります。
必ず --nocache_test_results を指定してください。 例外はありません。
2. シンプルに保つ — フィルターフラグを使わない
個別のテストケースを実行するために、--test_arg='-f' や同様のフィルターフラグを使わないでください。
理由: KJ テストの -f フラグは、一致するテストが 0 件でも気づかれないまま成功します。フィルターやテスト名を誤入力すると、実際にはテストが 1 件も実行されていないのに、Bazel は「PASSED」と報告します。これはまったく誤った安心感につながります。
テストターゲット全体を実行してください。 特定のテストを確認する必要がある場合は、全体の出力からその名前を探してください。テストスイート全体の実行に時間がかかりすぎる場合は、ターゲット内の一部をフィルターするのではなく、特定のテスト ターゲット(例://src/workerd/api:streams/standard-test@)を実行してください。
3. 完了を宣言する前にテストスイート全体を実行する
1 つのテストターゲットが成功しても、ほかの何かを壊していないとは限りません。共有コード(queue.c++、standard.c++、common.h)の修正によって、まったく別のディレクトリにあるテストが失敗することがあります。
修正が完了したと宣言する前に、必ず以下を実行してください。
bazel test //... --nocache_test_results
最終サマリー行を確認してください:Executed N out of N tests: N tests pass. の N がすべて一致している必要があります。テストが 1 つでも失敗した場合、修正は完了していません。
回帰テストのレッド・グリーン検証
バグ修正の回帰テストを書くときは、そのテストが実際にバグを検出することを必ず検証してください。
- グリーン:
bazel test //... --nocache_test_resultsを実行します — すべてのテストが成功します(修正が適用された状態) - レッド: 修正を取り除き、
bazel test //... --nocache_test_resultsを実行します — 新しいテストは必ず失敗します - グリーン: 修正を元に戻し、
bazel test //... --nocache_test_resultsを実行します — すべてのテストが再び成功します
手順 2 で成功してしまう場合(修正なしでもテストが失敗しない場合)、そのテストは想定どおりの内容を検証していません。テストを修正してください。
レッド・グリーン検証は、1 つのターゲットだけでなくテストスイート全体で実施してください。 これにより、(a)回帰テストが実際にバグを検出すること、(b)修正がほかのものを壊さないこと、の 2 つを同時に確認できます。
アンチパターン
| してはいけないこと | 代わりにすること |
|---|---|
bazel test //target(キャッシュフラグなし) | bazel test //target --nocache_test_results |
--test_arg='-f' --test_arg='test name' | ターゲット全体を実行し、出力からテスト名を検索する |
| 1 つのターゲットを実行して修正完了を宣言する | //... を実行し、全テスト成功のサマリーを確認する |
| 前回の実行結果を根拠に「テストは成功」と宣言する | 新たに実行し、新しい出力を確認する |
| フィルターによる「PASSED」を鵜呑みにする | 想定したテスト名が出力に含まれていることを確認する |