テストと品質保証
AIで包括的なテストスイートを生成。人間が見落としがちなエッジケースを網羅し、テスト時間を大幅短縮。
プレミアムコースコンテンツ
このレッスンはプレミアムコースの一部です。Proにアップグレードすると、すべてのプレミアムコースとコンテンツを利用できます。
- すべてのプレミアムコースを利用
- 1,000以上のAIスキルテンプレート付き
- 毎週新しいコンテンツを追加
🔄 前のレッスンでAIデバッグの技術を身につけた。今回はバグを「事前に」防ぐ——テストの自動生成を学ぶ。
テストの現実
開発者の多くが認める本音:「テストを書く時間がない」
実際は、テストを書かないことの代償の方がはるかに大きい。本番障害、深夜の緊急対応、リファクタリングの恐怖。
AIはこの方程式を変える。テストを書く時間を1/3以下に短縮しつつ、人間だけでは思いつかないエッジケースまで網羅する。
AIテスト生成の基本パターン
パターン1:関数単位のユニットテスト
以下の関数のユニットテストを書いてください。
```[language]
[テスト対象の関数]
条件:
- テストフレームワーク:[Jest/pytest/JUnit/etc.]
- 正常系のテストケース
- エッジケース(null、空配列、境界値、異常な入力)
- エラーハンドリングのテスト
- 各テストに日本語のテスト名をつける
### パターン2:エッジケース洗い出し
以下の関数に対して、テストすべきエッジケースをすべてリストアップしてください。
[関数コード]
各エッジケースについて:
- どんな入力か
- 期待する出力/動作
- なぜこのケースが重要か を説明してください。
### パターン3:既存テストの拡充
以下の既存テストスイートに不足しているテストケースを追加してください。
テスト対象コード:
[関数コード]
既存テスト:
[既存のテストコード]
不足しているエッジケースやシナリオを特定し、 テストコードを追加してください。
## テストの品質チェック
AI生成テストの罠:**実装詳細のテスト**
// ❌ 悪いテスト:実装詳細をテスト test(‘getUserが内部キャッシュを使う’, () => { getUser(1); expect(cache.get).toHaveBeenCalledWith(‘user:1’); });
// ✅ 良いテスト:動作をテスト test(‘同じユーザーを2回取得するとDBアクセスは1回’, () => { await getUser(1); await getUser(1); expect(db.query).toHaveBeenCalledTimes(1); });
**AI生成テストの検証チェックリスト:**
- [ ] **動作をテスト**しているか(実装詳細ではなく)
- [ ] テストが**失敗すべきとき**に本当に失敗するか
- [ ] **独立性**——テスト間に依存関係がないか
- [ ] **可読性**——テスト名だけで何をテストしているかわかるか
- [ ] **メンテナンス性**——実装変更でテストが壊れすぎないか
## テストカバレッジの戦略
すべてのコードに100%のカバレッジは不要。**リスクベースのカバレッジ**を目指す。
| コード種別 | カバレッジ目標 | 理由 |
|-----------|-------------|------|
| **ビジネスロジック** | 90%以上 | バグの影響が大きい |
| **API境界** | 85%以上 | 外部との契約 |
| **ユーティリティ** | 80%以上 | 多くの場所から呼ばれる |
| **UIコンポーネント** | 70%程度 | 変更頻度が高く、コスト対効果 |
| **設定/グルーコード** | 最低限 | 単純で壊れにくい |
## 実践演習
1. 自分のプロジェクトから関数を1つ選ぶ
2. AIにユニットテスト+エッジケースを生成させる
3. 「実装詳細のテスト」がないか検証する
4. テストを実行して結果を確認する
> 💡 **ポイント:** AIが生成するテストは「叩き台」。ノミネートしたケースを確認し、意味のないテストを削り、見落としを足す。AIのエッジケース発見力+あなたのドメイン知識=最強のテストスイート。
理解度チェック
まず上のクイズを完了してください
レッスン完了!