「Claude Codeにテスト書いてもらえるの便利ですよね、でも品質ってどうやって担保するんですか」 — 業務委託先のエンジニアから来た質問です。生成は速い。問題は「保守できるテスト」になるかどうかです。

この記事は、Claude Codeで自動テストを生成・保守する実用ルールを、私の半年の運用から整理したものです。

画面を実際に操作して確かめる種類のテストはClaude CodeとPlaywrightに分けました。

「テストファースト」と「事後追加」の使い分け

Claude Codeでテストを書く時の入り口は2つあります。

ひとつめは、テストファースト。実装する前に「このAPIに対するテストを書いて」と頼んで、その後で実装に進む流れ。

ふたつめは、事後追加。既存のコードに対して「このファイルにテストを足して」と頼む流れ。

私の運用では、新規機能はテストファースト、既存コードへの追加は事後、と使い分けています。テストファーストのほうが Claude が実装に集中しやすく、生成されるテストの質も上がる傾向があります。

フレームワーク別の頼み方

テストフレームワークごとに、Claude Code への頼み方は少し違います。代表的なものを並べます。

言語

フレームワーク

頼み方のコツ

Python

pytest

fixtureを共有させる前提でファイル分割を指示

JavaScript

jest

mock の戦略(jest.fn vs spy)を最初に握る

TypeScript

vitest

型定義との整合性を意識させる

Go

testing

table-driven test の形式を指定

Rust

cargo test

#[cfg(test)] とインライン配置の方針を握る

CLAUDE.mdに「テストは○○フレームワークを使う」「table-driven形式を優先する」のような規約を書いておくと、Claudeが毎回その形式に沿ってくれます。

失敗テストの修正ループ

Claude Codeでテストが一番効くのが、失敗テストの修正ループです。

「テストを走らせて、失敗したら直して、また走らせて」と頼むと、pytestjest を実行→失敗箇所を読み→修正→再実行、というサイクルをClaudeが回します。

$ claude
> pytest を走らせて、失敗したテストを順番に直してください。
> ただし、テスト側ではなくプロダクションコード側を直してください。
> 5回まで試して、それでも全部通らなければ報告してください。

「テスト側を直すな、プロダクションコード側を直せ」という指示が大事です。これがないと、Claudeが「テストが間違っている」と判断して、テストのassertionをいじって通そうとする事故が起きます。

「テストの質」を担保する3つの指示

生成されたテストの質を保つために、私がよくCLAUDE.mdに書いている指示が3つあります。

ひとつめ。「テストは1つにつき1つのことだけを確認する」。テストごとの責任範囲を狭く保つ。

ふたつめ。「テスト名は何をどんな条件でテストしているかが分かる形にする」。命名が雑だと、半年後に自分が読めなくなります。

みっつめ。「Given-When-Then 構造で書く」。準備・実行・検証の3段階に分けて書かせる。

これら3つを CLAUDE.md に書いておけば、Claudeが生成するテストの品質が一段上がります。

モックの戦略を最初に握る

外部依存(API、DB、ファイルシステム)があるコードのテストでは、モックの戦略が重要です。

「全部本物のDBに対してテストするのか」「全部モックにするのか」「重要なところだけ実DBで他はモックか」を最初に握っておかないと、Claudeが場当たり的にモックを書いて、半年後に保守不能になります。

私の研修先で勧めているルールは「ユニットテストは全部モック、結合テストは実物に対して」というシンプルな分け方。CLAUDE.mdに書いておけば、毎回のテスト生成でこのルールに沿ってくれます。

カバレッジは目安、信頼性が本質

最後に、テストの「量」の話を。

「テストカバレッジを80%にして」と頼めば、ClaudeはカバレッジツールでX%を満たすテストを生成します。ただ、これは数字を満たすための作業になりがちです。

私の運用では、カバレッジは「足りないところを見つけるための目安」として使い、「重要なロジックに信頼性のあるテストがあるか」を最終判断にしています。Claudeに「カバレッジ80%」と頼むより、「このビジネスロジックの主要パターンを網羅して」と頼むほうが、結果として保守しやすいテストになります。

CIとの組み合わせ

最後に、CIとの組み合わせ。テスト生成と保守はClaude Code側で、CIで通すのは別の話です。

ローカルでテストが通っても、CI上の環境差で落ちることはある。CIに /code-review ultra を組み込んでおくと、テスト不足や見落としをマージ前に検出しやすくなります。

まとめ

  • 新規機能はテストファースト、既存コードへの追加は事後の使い分けが効く
  • CLAUDE.mdにフレームワークとテスト規約(table-driven, Given-When-Then等)を明示
  • 失敗テストの修正は「テストではなくプロダクション側を直せ」と指示する
  • テストの質は「1つにつき1つの確認」「分かる命名」「Given-When-Then」の3点で担保
  • モックの戦略(ユニット=モック / 結合=実物)を最初に握る
  • カバレッジは目安、信頼性のあるテストが本質
  • ローカルテスト+CIでの ultrareview の組み合わせでマージ前の網羅性を上げる