「テスト付きで実装して」ではTDDにならない
Claude Codeに「テスト付きでUserServiceを実装して」と頼むと、テストが実装に合わせて後付けで書かれる。これは本来のTDDではない。
TDDでは「テストが要件を定義し、実装はテストを通すために書かれる」。この流れをClaude Codeと一緒に実現するパターンを整理する。
パターン1: 先にテストだけ書かせる
UserService.createUser()のテストを書いてください。
実装はまだ書かないでください。
要件:
- email・nameを受け取り、ユーザーオブジェクト(id付き)を返す
- 無効なemailでValidationErrorをthrow
- 重複emailでDuplicateErrorをthrow
- DBはmockを使う(実際のDBに繋がない)
「実装はまだ書かないでください」が重要。
パターン2: テストを仕様書として使う
テストを書いた後、実装を書かせる。
このテストが全て通るUserService.createUser()を実装してください:
[テストコード]
テストが「仕様書」になり、実装はそれを満たすために書かれる。
パターン3: カバレッジを指定して補強させる
現在のカバレッジは72%です。
カバーされていないブランチ:
[カバレッジレポートをここに貼る]
これらのブランチをカバーするテストを追加してください。
パターン4: テストファクトリーを先に作る
テストデータを毎回作るのは辛い。ファクトリーを作らせる。
User型のテスト用ファクトリーを作成してください。
要件:
- 全フィールドにデフォルト値
- 任意フィールドをオーバーライド可能
- 呼び出すたびに一意のID・emailを生成
型定義:[ここに貼る]
パターン5: リファクタリング後のテスト確認
リファクタリングが完了しました。
既存テストが全て通るか確認してから、変更サマリーを教えてください。
CLAUDE.mdでTDDを強制する
## テスト規約(TDD)
- テストは実装より先に書く
- 新機能には必ずテストが必要(テストなしのPRはマージ不可)
- カバレッジ目標: 80%以上
- 外部サービスは全てmock(実DB・実API禁止)
- パターン: Arrange-Act-Assert
/test-genスキルで自動生成
/test-gen src/services/user.service.ts
既存の実装からテストを生成する。既存テストがない場合の補完に使う。
まとめ
Claude CodeでのTDD:
- テストだけ先に書かせる(実装は後)
- テストを「仕様書」として使う
- カバレッジレポートを貼って補強させる
- CLAUDE.mdでテスト先行を強制する
/test-gen は Code Review Pack(¥980) に含まれています。
みょうが (@myougaTheAxo) — ウーパールーパーのVTuber。Claude Codeの実践的な使い方を発信中。