Test Quality Audit
トリガー
- •テストスイートのレビュー依頼
- •テスト実行時間が長い
- •Flaky testが発生
- •新規参画者のオンボーディング
監査プロセス
text
1. 全テスト一覧化 2. Usefulness Score算出 3. カテゴリ分類 4. 削除候補特定 5. 改善提案
Usefulness Score評価
計算式
text
Score = Impact(1-5) × Probability(1-5)
判定基準
| スコア | 判定 | アクション |
|---|---|---|
| ≥20 | CRITICAL | 必須維持、最優先修正 |
| 15-19 | KEEP | 維持 |
| 10-14 | REVIEW | 再検討、統合検討 |
| <10 | REMOVE | 削除候補 |
監査チェックリスト
1. ビジネス価値監査
- • テストはビジネスロジックを検証しているか?
- • フレームワーク機能のテストではないか?
- • ユーザー価値に直結するか?
NG例:
- •
it('should render component')→ フレームワークテスト - •
it('should call useEffect')→ 実装詳細テスト
2. 重複監査
- • 同じ振る舞いを複数テストしていないか?
- • E2Eで担保されているのにUnitでも書いていないか?
- • 統合可能なテストがないか?
3. 信頼性監査
- • Flaky testはないか?
- • 環境依存テストはないか?
- • 実行順序依存はないか?
Flaky判定: 10回実行で1回でも異なる結果 = Flaky
4. 保守性監査
- • テスト名から意図が分かるか?
- • 失敗時の原因特定が容易か?
- • テストデータは明確か?
5. パフォーマンス監査
- • 実行時間は許容範囲か?
- • 不要なsetup/teardownはないか?
- • 並列実行可能か?
削除対象パターン
即時削除
| パターン | 理由 |
|---|---|
| フレームワークテスト | フレームワークの責務 |
| ゲッター/セッターテスト | 価値なし |
| コンストラクタテスト | 価値なし |
| モック検証のみ | 実装詳細 |
| 常に成功するテスト | 意味なし |
検討後削除
| パターン | 条件 |
|---|---|
| 重複テスト | 上位層で担保済み |
| 古いテスト | 対応機能が削除済み |
| 複雑すぎるテスト | 保守コスト > 価値 |
監査レポートフォーマット
markdown
# テスト品質監査レポート ## サマリー | 指標 | 値 | |------|-----| | 総テスト数 | X | | CRITICAL (≥20) | X | | KEEP (15-19) | X | | REVIEW (10-14) | X | | REMOVE (<10) | X | ## 削除推奨 | テスト | スコア | 理由 | |--------|--------|------| | test_xxx | 6 | フレームワークテスト | ## 改善推奨 | テスト | 現スコア | 改善案 | |--------|----------|--------| | test_yyy | 12 | 境界値追加で15+ | ## カバレッジギャップ | 領域 | 現状 | 必要 | |------|------|------| | Money | 18 | 20+ |
自動監査ルール
yaml
# .github/workflows/test-audit.yml
rules:
- name: no-framework-tests
pattern: "expect.*toBeInTheDocument|toBeDefined"
action: warn
- name: no-implementation-details
pattern: "toHaveBeenCalledWith.*internal"
action: warn
- name: no-flaky-tests
pattern: "retry|flaky|skip"
action: error
禁止事項
- •❌ 監査なしのテスト追加
- •❌ スコア未記載のテスト
- •❌ 削除候補の放置
- •❌ Flakyテストの許容
- •❌ フレームワークテストの維持
品質ゲート
| 指標 | 閾値 |
|---|---|
| REMOVE比率 | <5% |
| Flaky率 | 0% |
| 平均スコア | ≥15 |
| カバレッジギャップ | 0 |