test-driven-development について
コーディングエージェントにテスト駆動開発を促すスキルです。失敗するテストを確認してから最小限の実装を行い、リファクタリング後にコミットします。テストで挙動を確かめながら、段階的に変更する場面に適しています。
主な機能
- 01RED-GREEN-REFACTOR サイクル
- 02想定どおりのテスト失敗を確認
- 03テストを通す最小限の実装
- 04テストを維持したリファクタリング
- 05各サイクル後のコミット
活用シーン
- 01新しい関数やモジュールの開発
- 02失敗テストによるバグ再現
- 03リファクタリング前後のテスト確認
- 04小さくレビューしやすいコード変更
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ itallstartedwithaidea/ agent-skills --skill test-driven-developmentインストール後、Claude Code で/test-driven-developmentを入力して読み込まれたか確認します。
詳細
テスト駆動開発
googleadsagent.ai™によるAgent Skills™の一部です。
説明
テスト駆動開発では、エージェントが作成するすべてのコード変更に対して、RED-GREEN-REFACTOR の規律を徹底します。まず失敗するテストを書いて失敗を確認し、テストを通すための最小限のコードを書いて成功を確認し、わかりやすくするためにリファクタリングしてからコミットします。対応するテストによって作成が要求されていない本番コードは存在しません。
このスキルは、エージェントによくあるアンチパターン、つまり「正しく見える」ものの、エッジケースで気づかないうちに壊れる、テストされていない大量のコードを生成することを防ぎます。エージェントに TDD サイクルを徹底させることで、本番コードの各行が特定のテストアサーションによって正当化されます。その結果、テストカバレッジが後回しにされるのではなく、構造的に保証されたコードベースが実現します。
このサイクルはバージョン管理と直接連携します。RED-GREEN-REFACTOR の反復ごとにアトミックコミットが作成され、設計上の判断を確認できる履歴が残ります。リファクタリングのフェーズは必須です。次の機能追加に進む前に、エージェントは命名、重複、構造の明確さを評価する必要があります。
使用する場面
- 新しい関数、メソッド、モジュールを作成するとき
- バグを修正するとき(まずバグを明らかにするテストを書きます)
- 既存のコードをリファクタリングするとき(前後でテストが成功することを確認します)
- ユーザーが「TDD」「test-first」「red-green-refactor」を求めたとき
- API、データ変換、ビジネスロジックを構築するとき
- 変更によってリグレッションが発生しないという確信が必要なとき
仕組み
graph LR
R[RED: Write Failing Test] --> G[GREEN: Minimal Code to Pass]
G --> RF[REFACTOR: Clean Up]
RF --> C[COMMIT: Atomic Commit]
C --> R
style R fill:#e74c3c,color:#fff
style G fill:#2ecc71,color:#fff
style RF fill:#3498db,color:#fff
style C fill:#95a5a6,color:#fff
RED:次に追加する小さな振る舞いを記述するテストを書きます。実行し、想定どおりの理由で失敗することを確認します。構文エラーやインポートエラーではなく、実際のアサーション失敗であることを確認してください。GREEN:テストを通すための最もシンプルな本番コードを書きます。汎用化したくなる気持ちは抑えます。REFACTOR:名前を改善し、重複を抽出し、制御フローを簡素化します。すべてのテストが引き続き成功する必要があります。COMMIT:追加した振る舞いに言及するメッセージを付けて、ステージングしてコミットします。
実装
# RED: Write the failing test first
def test_calculate_discount_applies_ten_percent_for_orders_over_100():
order = Order(items=[Item(price=150.00)])
result = calculate_discount(order)
assert result == 135.00 # 10% off
# Run: pytest => FAIL (calculate_discount not defined)
# GREEN: Minimal implementation
def calculate_discount(order):
total = sum(item.price for item in order.items)
if total > 100:
return total * 0.9
return total
# Run: pytest => PASS
# REFACTOR: Extract magic numbers
DISCOUNT_THRESHOLD = 100
DISCOUNT_RATE = 0.10
def calculate_discount(order):
total = sum(item.price for item in order.items)
if total > DISCOUNT_THRESHOLD:
return total * (1 - DISCOUNT_RATE)
return total
# Run: pytest => PASS
# git commit -m "feat: apply 10% discount for orders over $100"
避けるべきアンチパターン
| アンチパターン | 問題点 |
|---|---|
| コードを書いた後にテストを書く | テストが確認するのは振る舞いではなく、想定になってしまいます |
| 実装の詳細をテストする | 有効なリファクタリングでも、壊れやすいテストが失敗します |
| RED の手順を省略する | テストが実際に失敗することを証明できません |
| GREEN の変更が大きすぎる | どのテストがどのコードを促したのか追跡できなくなります |
| REFACTOR の手順を省略する | 技術的負債が気づかないうちに蓄積します |
ベストプラクティス
- RED-GREEN-REFACTOR の各サイクルは5分以内を目安にします
- GREEN で10行を超えるコードが必要な場合、テストの目標が大きすぎます。分割してください
- テスト名は振る舞いの仕様として付けます:
test_<action>_<condition>_<outcome> - 新しいテストだけでなく、REFACTOR のたびにテストスイート全体を実行します
- 設計の経緯を残すため、サイクルを完了するたびにコミットします
- テストダブル(モック、スタブ)は、アーキテクチャ上の境界でのみ使用します
プラットフォーム互換性
| プラットフォーム | サポート | 備考 |
|---|---|---|
| Cursor | 完全 | シェルツールでテストを直接実行 |
| VS Code | 完全 | テスト実行にターミナル統合を使用 |
| Windsurf | 完全 | Cascade がテストコマンドを実行 |
| Claude Code | 完全 | pytest/jest を直接シェルから実行可能 |
| Cline | 完全 | テストランナーを設定可能 |
| aider | 部分的 | 手動でテスト結果を確認する必要あり |
関連スキル
- Systematic Debugging - バグを再現する失敗テストを書くことから始める根本原因分析
- Code Review - 本番コードの変更とともにテストカバレッジも確認する品質ゲート
- Subagent-Driven Development - サブタスクごとに独立して TDD サイクルに従う、分離されたサブエージェント
キーワード
tdd test-driven-development red-green-refactor failing-test-first test-first unit-testing regression-prevention atomic-commits
© 2026 googleadsagent.ai™ | Agent Skills™ | MIT License