Agent skill
test-coverage-guard
既存テストの信頼性を検証し、偽陽性を検出・排除するガードレール。テストがGREENになった後に発動する。
Install this agent skill to your Project
npx add-skill https://github.com/TakumiOkayasu/dotfile-work/tree/main/claude/skills/test-coverage-guard
SKILL.md
Test Coverage Guard
トリガー条件
キーワード(いずれか)
- 「テストレビュー」「テストの品質」「偽陽性」「false positive」「テストが信頼できない」
- 「モックが多すぎる」「カバレッジは高いのにバグが出る」「フレイキーテスト」「flaky test」
- 「テスト削除していい?」「このテスト意味ある?」「test review」「mutation testing」
- 「テストスイートが通っているのに不安」「テスト全部通るけど大丈夫?」
状況
- テストGREEN後、スイートの品質に不安がある場面
- PRレビューでテストコードの品質を確認したい場合
非対象(委譲先)
- テスト新規作成 →
test-driven-development - CI/CD設定 →
ci-cd - セキュリティテスト詳細設計 →
security-review
前提条件
- レビュー対象のテストファイルが存在すること
- テストが実行可能な状態(環境構築済み)
- 対象プロジェクトの言語・フレームワークが判明していること
目的
偽陽性: 本来FAILすべきテストがPASSしている状態。緑でも本番で壊れるなら誤った安心感を与えるだけ。
| スキル | 責務 | タイミング |
|---|---|---|
| test-driven-development | テスト設計・作成(TDDサイクル) | テストを書く時 |
| 本スキル | テスト検証(偽陽性検出・網羅性指摘) | テストGREEN後 |
本スキルはTDDサイクルを中断・上書きしない。不足発見時は「何が不足か」を報告しTDDスキルに委譲。
実行手順
Step 1: スコープ特定
| 戦略 | 適用場面 |
|---|---|
| PR差分ベース | PRレビュー・直近変更 |
| モジュール単位 | 「この機能のテストをレビューして」 |
| リスクベース | カバレッジ低・バグ多・クリティカル機能を優先 |
| 全件 | 小規模プロジェクト・初回導入 |
⚠️ 対象100件超の場合、リスクベースで絞り込みを提案する。
Step 2: 偽陽性スキャン(P1→P2→P3順)
P1(即時修正)
パターン1: アサーション不足
コアロジックを return null に置換してもPASSするなら確定。戻り値・状態変化・副作用すべてを検証する。
パターン2: テストダブル過多
Mock2つ以上で要注意。合計5つ以上なら設計見直し検討。外部APIのみStub、DBは実物で状態を検証する。
パターン3: 呼び出し文脈の欠落
本番フローで前後処理がデータ状態を変える場合、その前処理を再現しているか確認。バッチ・パイプライン・ミドルウェアで起きやすい。
パターン4: privateメソッドの直接テスト
Reflection等でprivate直接テスト → publicメソッド経由の間接検証に置換。
例外(以下すべてを満たす場合のみ):
- 同機能の統合テストが既存でPASS
- 純粋な計算ロジック(副作用なし)
- 統合テストでは網羅困難な境界値
- 抽出不適切の理由をコメント明記
P2(次スプリント)
パターン5: 正常系のみ
以下が不足していないか確認:
- 入力異常: null/空/0/負数/最大値/存在しないID
- 状態異常: 未認証・権限不足・論理削除済み・ロック中
- 外部依存異常: タイムアウト・接続エラー・レート制限
- 境界値: 境界-1 / 境界 / 境界+1 の3点セット
指摘のみ。テスト追加はTDDスキルに委譲。
P3(バックログ)
パターン6: テストデータと本番データの乖離
DB側デフォルト値・バリデーション・関連テーブル連動を再現しているか確認。重要データは本番と同じAPI/サービス経由で作成する。
パターン7: フレイキーの温床
| 原因 | 対策 |
|---|---|
| テスト間状態共有 | テストごとにDB/状態リセット |
| 非同期待機不足 | waitFor/eventually使用。sleep(固定値) 禁止 |
| 外部サービス依存 | テストダブルまたはテストコンテナ |
| システム時刻依存 | FakeClockで時刻注入 |
| 並列実行リソース競合 | スキーマ分離またはトランザクション分離 |
⚠️ フレイキーテストは放置禁止。修正するか削除する。
パターン8: スナップショット形骸化
内容確認なしで --update-snapshot している場合。スナップショットは50行以下に保ち、重要部分は別途明示的にアサートする。
Step 3: ミューテーション思考実験
以下の変異を思考上で適用し、1つでもFAILしなければアサーション不足:
- コアロジックを
return nullに置換 → FAILするか? - if条件を反転 → FAILするか?
- 演算子変更(
+→-、>→>=) → FAILするか? - 重要な副作用(DB保存・通知)をコメントアウト → FAILするか?
ミューテーションスコア目安: 80%以上(100%不要。等価ミュータントがあるため)
自動化ツール:
| 言語 | ツール | 言語 | ツール |
|---|---|---|---|
| JS/TS | Stryker | Python | mutmut |
| Java/Kotlin | PIT | Ruby | mutant |
| Go | gremlins | C#/.NET | Stryker.NET |
Step 4: テストダブル検証
チェックポイント
- Mock数: 1テストあたり2つ以上で要注意
- レスポンス一致: 型・フィールド名・ネスト構造が実際と一致しているか
- エラーケース: タイムアウト・エラーレスポンス・不正データのStubが存在するか
- 自プロジェクトのDB/クラスをテストダブルで差し替えていないか(実物が原則)
| 種類 | 推奨用途 |
|---|---|
| Stub | 外部APIの正常/異常レスポンス |
| Mock | 通知送信など副作用の発生確認 |
| Fake | InMemoryRepository, FakeClock |
| Spy | 実処理維持しつつ呼び出し記録 |
| 対象 | 推奨 |
|---|---|
| 外部API(決済・SMS等) | Stub/Mock |
| 非決定的な値(時刻・乱数) | Fake |
| 自プロジェクトのDB | 実物 |
| 自プロジェクトの他クラス | 実物 |
Step 5: 網羅性の指摘
- 正常系に対応する異常系テストが存在するか
- エラーレスポンスの型・メッセージ・ステータスと副作用の不在を検証しているか
- セキュリティ関連(未認証拒否・他ユーザーリソースへのアクセス拒否)のテストが存在するか
- 並行性関連(楽観ロック・在庫同時減算・冪等性)のテストが存在するか
不足テストの一覧をレポートに含める。実装はTDDスキルに委譲。
Property-Based Testing(JS/TS: fast-check、Python: Hypothesis)は既存テストの補完として有効。置き換えではない。
Step 6: レポート出力
## テストレビュー結果
### 🔴 要修正(偽陽性リスク: 高)
- **[テスト名]** — パターンN: [具体的な問題] → [修正方針]
### 🟡 改善推奨
- **[テスト名]** — パターンN: [具体的な問題] → [修正方針]
### 🟢 問題なし
- [テスト名]: [検証済みの観点]
### 📊 サマリー
- 検証テスト数: N / 要修正: N件 / 改善推奨: N件 / 問題なし: N件
- 不足テスト候補: [異常系・境界値テストの一覧 → TDDスキルに委譲]
禁止事項・制約
| 禁止事項 | 理由 |
|---|---|
| 不足テストを本スキル内で実装する | テスト作成はTDDスキルの責務 |
| TDDサイクルを中断・上書きする | 本スキルは検証専用 |
sleep(固定値) による非同期待機 |
フレイキーの原因 |
| フレイキーテストの放置 | CI全体の信頼性を下げる |
| カバレッジ数値を目標として追う | 価値の低いテストを量産する |
| 既存コードへカバレッジゲートを遡及適用 | 価値の低いテスト量産のインセンティブが生まれる |
テスト削除の判断基準
削除してよい条件(いずれか該当 かつ 代替テストが存在/追加予定の場合のみ):
- 同層の他テストと検証内容が完全重複し、独自に検出できるバグがない
- 過去6ヶ月でリファクタリング起因の修正が3回以上で、その間バグを1度も検出していない
- テストダブルの保守コストが検出するリスクに見合わない
即削除すべきテスト:
| テスト | 理由 |
|---|---|
| 常にPASS(アサーションなし/トートロジー) | 偽の安心感 |
| 実装内部構造をそのままなぞっている | リファクタリングのたびに壊れる |
| テストダブル過多で実際の振る舞いを未検証 | 偽陽性の温床 |
| フレイキーで修正見込みなし | CI全体の信頼性を下げる |
カバレッジの正しい使い方
- 目標ではなくテスト漏れの発見ツールとして使う
- ラインカバレッジよりブランチカバレッジを重視する
- ミューテーションスコアを併用してテストの検出力を直接計測する
- CIゲートは「新規コード/変更コード」に限定する
- 未カバー行をテスト追加の候補リストとして活用する
関連スキルとの連携
| スキル | 連携ポイント |
|---|---|
| test-driven-development | 不足発見時はTDDスキルに戻ってテストケースを追加。本スキルは指摘まで |
| ci-cd | テストの段階実行、CIゲート設定 |
| security-review | セキュリティテストの詳細設計 |
| performance-optimization | テスト実行時間のボトルネック調査 |
Recommended Agent Skills
Expand your agent's capabilities with these related and highly-rated skills.
performance-optimization
パフォーマンス最適化やプロファイリング時に使用。計測手法、ボトルネック特定、負荷テスト、レポート出力をカバー。
systematic-debugging
バグやテスト失敗に遭遇した際に使用。修正前の4フェーズ根本原因分析を強制。
interface-first-design
機能追加・クラス設計・interface設計・依存関係整理・責務分割時に使用。疑似コードから interface→クラス→TDD→実装の順で設計する。TDDスキルの前段。
consultation
実装中に判断が必要になった時、技術選定・設計相談が必要な時に使用。相談テンプレートで構造化された問題提示を強制。
refactoring
振る舞いを変えずにコード構造を改善する際に使用。
e2e-browser
ブラウザE2Eテスト生成・実行・レポート(Docker内Playwright+Bun+Knex.js)。UI操作+DB検証+全ステップスクショ。WSLg/noVNC/headless切替対応。プロジェクト非汚染。
Didn't find tool you were looking for?