2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AIがしょっぱいテストを生成する理由 — 文脈設計で変わるClaude Codeのテスト品質

2
Posted at

はじめに

Claude Code(あるいは他のAIエージェント)にテストコードを書かせると、なぜか「動作確認にしかなっていない」「網羅性がない」「境界値を踏まない」しょっぱいテストばかり返ってくることがあります。

最近Qiitaでも話題になっていた「AIがしょっぱいテストケースを作る理由」を、自分の運用経験を踏まえて深掘りしてみます。

結論を先に書くと、しょっぱいテストの原因は、AIではなく『AIに渡している文脈』にあるということでした。


しょっぱいテストの典型パターン3つ

パターン1: ハッピーパスしか書かない

// AI生成: 「ユーザー作成のテストを書いて」
test('createUser creates a user', async () => {
  const result = await createUser({ name: 'Alice', email: 'alice@example.com' });
  expect(result.success).toBe(true);
});

正常系1ケースだけで終わる。重複メール・空文字・最大長超過などの境界は触れない。

パターン2: 振る舞いではなく実装をテスト

test('updates state correctly', () => {
  const spy = jest.spyOn(store, 'setState');
  doSomething();
  expect(spy).toHaveBeenCalledTimes(1);
});

「リファクタしたら壊れるテスト」を量産する。本来は「結果として何が起きるか」をテストすべき。

パターン3: モックでガチガチ

外部依存をモックしすぎて、本物の挙動と乖離。「テストは通るが本番で落ちる」典型。


なぜしょっぱくなるのか — 文脈不足が原因

AIに「テストを書いて」とだけ伝えると、AIは「とりあえず動かす最小ケース」を出します。それは合理的な振る舞いです。

問題は 「品質基準を渡していない」 こと。

エンジニアは無意識のうちに、以下の文脈を持ってテストを書いています:

  • このコードはどのレイヤーか(ドメイン / インフラ / UI)
  • ビジネス的にクリティカルなパスはどこか
  • 過去にどんなバグがあったか
  • どこまでがチームの合意基準か

これらをAIは知りません。だから「中庸の最小限テスト」しか書けません。


改善パターン: テスト用「文脈ファイル」を渡す

実務で効いたのは、テスト生成時にAIに渡す 専用の指示ファイル を用意することでした。

.claude/skills/write-test/skill.md の例

# テスト作成スキル

## 必須カバレッジ
- 正常系: 最低2パターン(典型ケース・境界ケース)
- 異常系: 入力バリデーション失敗・外部APIエラー・タイムアウト
- 境界値: 空文字・最大長・null・undefined・型違い

## モックポリシー
- 外部API(fetch等)はモックOK
- 自プロジェクト内のロジック・ヘルパーはモック禁止(実物を使う)
- DBアクセスはテスト用DBを使う(モック禁止)

## 命名規則
- describe: 関数名
- test: 「[入力条件] → [期待挙動]」形式

## 過去の事故ベース
- メールアドレスは必ず大文字小文字を統一する(過去事故)
- 日付比較はタイムゾーンを明示する(過去事故)

このファイルを CLAUDE.md から参照させると、「テスト書いて」と一言指示するだけで、しょっぱくないテストが返ってくる確率が一気に上がります。


さらに踏み込んだ運用: テスト結果を学習させる

書かせたテストを実行した後の 失敗パターン をAIに記録させる仕組みを作ると、しょっぱさが継続的に減ります。

# テスト失敗時にAIに記録させる
npm test 2>&1 | claude code --skill record-test-failure

失敗の傾向(例: 「境界値テストを忘れがち」)を skill.md の「過去の事故ベース」セクションに自動追記させる。

これを1〜2週間回すと、AIが自分のチームのバグ傾向に「適応」していきます。


まとめ

AIがしょっぱいテストを生成する理由は、AIの能力不足ではなく、

  1. 品質基準が渡されていない(カバレッジ・モックポリシー)
  2. チーム固有の文脈が共有されていない(過去事故・命名規則)
  3. 継続的なフィードバックループがない(失敗を学習に変換していない)

の3点に集約されます。

逆に言えば、これらを CLAUDE.md や Skills に仕込んでおけば、AIは 「あなたのチーム専用のテスト書き」 に育てられます。


未経験者向けの講座を運営しています

未経験から Next.js + Supabase + Claude Code で Webアプリを作って公開するまで を、全20セッションで体系化した教材です。Claude Code を学習パートナーにする CLAUDE.md / Skills 設計までセットで含みます。

※ Qiita 読者の方には易しすぎる内容なので、初心者の知り合いへの紹介や社内研修の参考としてどうぞ。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?