
AI時代のTDD:Codex実践マニュアル
TDD を Codex で再現可能なワークフローに変えます。AGENTS.md を使用してプロジェクトの規律を記述し、スキルを使用してレッドおよびグリーンのリファクタリングを強化し、サブエージェントを使用してステージを分離し、フックを使用してテストの差分をチェックします。
まず地図をください
コンセプト 内容: AI プログラミングにおける TDD の価値は、「最初にテストを書く」という儀式ではなく、最初に検証可能な赤信号を作成し、その後実装で青信号に変えることです。
この記事では、Codex を実装する方法について説明します。
すぐに「どの書類を照合する必要があるか」と尋ねないでください。もっと良い質問は次のとおりです。
Codex を毎回同じ TDD ワークフローで動作させるにはどうすればよいですか?
このワークフローは 4 つのレベルに分割できます。
| 階層 | 何をしている | どこ | いつが適切ですか |
|---|---|---|---|
| L1 | プロジェクトの規律を書く | AGENTS.md | すべてのプロジェクトには |
| L2 | 固化プロセス | .agents/skills/tdd-codex/SKILL.md | 要件を満たすために TDD を繰り返し使用する |
| L3 | 隔離段階 | .codex/agents/*.toml | 複雑なタスク、テストと実装の間の相互汚染の恐れ |
| L4 | 自動リマインダー | .codex/hooks.json | 重要な倉庫、AI が密かにテストを変更するのを恐れる |
利用可能な最小のバージョンは L1 + L2 です。
完全な防御ラインは L1 + L2 + L3 + L4 です。
1. まず「完了」とは何かを定義します。
完了基準がない場合、Codex は簡単に「書かれたコード」を「完了」として扱うことができます。
TDD シナリオでは、完了基準をより具体的にする必要があります。
証拠はすべてのラウンドで提出されなければなりません
Codex にラウンドごとに次の 6 つの項目を報告させます。
Behavior: 这一轮实现哪个行为
Test: 测试文件和测试名
Command: 跑了什么命令
RED: 失败原因是否符合预期
GREEN: 通过结果是什么
REFACTOR: 是否重构,为什么これは「完了」よりもはるかに便利です。
これにより、最初に実装を記述してから合理的と思われるテストを追加するのではなく、モデルが実際に赤と緑のサイクルを通過したことがわかります。
ラウンドで処理される動作は 1 つだけです
これは重要です。
Codex にテスト マトリックス全体を一度に生成させないでください。これは「水平敷設テスト」になります。
RED: test1, test2, test3, test4, test5
GREEN: 一次写一个大实现あなたが望むのは、それを縦にスライスすることです。
RED test1 -> GREEN impl1 -> REFACTOR
RED test2 -> GREEN impl2 -> REFACTOR
RED test3 -> GREEN impl3 -> REFACTOR最初の実装ラウンドでは、問題の理解が変わります。すべてのテストを一度に作成しないでください。
2. L1: AGENTS.md に規律を書き込む
AGENTS.md は、プロジェクトに入るときに Codex が読み取る記述ファイルです。
OpenAI の公式ドキュメントには、Codex が最初にグローバル記述を読み取り、次にプロジェクトのルート ディレクトリから現在のディレクトリまでそれを読み取ると記載されています。各層は最初に AGENTS.override.md を読み取り、それ以外の場合は AGENTS.md を読み取ります。現在のディレクトリに近い記述ほど後から表示されるため、優先度が高くなります。デフォルトのマージ制限は 32 KiB であるため、ここに長いチュートリアルを書くことはできません。
プロジェクトの交通ルールのようなものであるべきです
AGENTS.md は、Codex に TDD とは何かを教える責任はありません。このプロジェクトではどのような行為が許可されていないのかを明確に記述することのみを担当します。
この段落を直接配置できます。
# TDD Rules
- For new behavior and bug fixes, use red/green TDD.
- RED: write exactly one failing behavior test first.
- Run the smallest relevant test command and confirm the failure is expected.
- Do not edit production implementation during RED.
- GREEN: write the minimum production code required to pass the current failing test.
- Never modify, delete, skip, or weaken tests to make implementation pass.
- REFACTOR only after tests are green.
- Keep structural changes and behavior changes separate.
- Report Behavior, Test, Command, RED, GREEN, and REFACTOR for each cycle.追加のプロジェクト コマンド:
# Verification
- Use `pytest` or the smallest relevant pytest command for Python behavior tests.
- Use `npm run types:check` only when this blog site's MDX or TypeScript changes.
- Use the smallest targeted command during RED/GREEN loops.
- If a command is slow, explain what targeted command was used first and what full command remains.百科事典として書いてはいけません
不正な AGENTS.md には次の内容が入ります。
- TDDの歴史
- すべてのテスト哲学
- 大量のフレームワークチュートリアル
- 複雑なプロンプトテンプレート
- さまざまな言語での完全な仕様
これらのことは、本当に重要なルールを薄めます。
私の提案は次のとおりです: AGENTS.md 常駐の規律のみを配置します。長いプロセスにはスキルを使用してください。
3. L2: プロセスをコーデックススキルに変換する
AGENTS.md は「デフォルトの規律」を解決し、スキルは「完全なプロセス」を解決します。
Codex に対して「TDD で実行してください」とよく言う場合、この文をプロジェクト レベルのスキルにアップグレードする必要があります。
ディレクトリ構造
ここに入れてください:
.agents/
skills/
tdd-codex/
SKILL.mdCodex は、現在のディレクトリから .agents/skills までをスキャンします。ウェアハウスのルート ディレクトリにあるスキルは、チームが使用するワークフローに適しています。
利用可能な最小限の SKILL.md
---
name: tdd-codex
description: Implementing or fixing maintainable code with Codex using strict red-green-refactor TDD. Use for new behavior, bug reproduction, behavior tests, or safe AI coding.
---
# TDD Codex Workflow
Use one behavior slice per cycle.
## Phase 0: Scope
Identify one observable behavior.
Name the public API, user flow, or integration boundary under test.
Do not edit production code.
## Phase 1: RED
Write exactly one failing behavior test.
Prefer public behavior over implementation details.
Run the smallest relevant test command.
Confirm the failure is expected.
Stop and report:
- Behavior
- Test file
- Command
- Failure reason
## Phase 2: GREEN
Write the minimum production code to pass the current failing test.
Never modify, delete, skip, or weaken tests to pass.
Do not add speculative features or abstractions.
Run the same test command.
Report the passing result.
## Phase 3: REFACTOR
Only refactor after tests are green.
If the code is already simple, skip.
If refactoring, make one structural change at a time.
Run tests after each refactor.
Do not change behavior.
## Cycle Report
Return:
- Behavior:
- Test:
- Command:
- RED:
- GREEN:
- REFACTOR:
- Next slice:呼び出しメソッド
これからは次のように言えます。
用 tdd-codex skill 做这个需求。
每轮只处理一个行为。
先 RED,确认失败后停下来,不要直接写实现。またはもっと短くすると:
用 tdd-codex。先写红灯,等我说 go。重要なのは、プロンプトがどれほど美しいかということではなく、Codex を毎回同じ軌道に戻すということです。
4. L3: サブエージェントを使用して赤と緑の再構築を分離する
すべてのタスクにサブエージェントが必要なわけではありません。
ただし、タスクが複雑で、テストが実装によって汚染されやすく、リファクタリングが制御不能になりやすい場合は、RED、GREEN、および REFACTOR を異なるエージェントに分割する方が安定します。
解体する価値があるのはいつですか?
分解に適しています:
- 権限、課金、ステートマシン -マルチモジュール機能
- バグは非常に隠されているため、最初に再発テストを作成する必要があります
- モデルは常にグリーンを取得するためのテストに変更されます
- テスト品質のレビューのみを担当する人が欲しい
分解には適していません:
- ガジェット機能
- コピーライティングの変更
- 純粋な視覚的な微調整
- ワンタイムスクリプト
エージェントを解体するコストは現実的です。分離によるメリットが通信のコストを上回る場合にのみ使用してください。
RED agent
# .codex/agents/tdd-test-writer.toml
name = "tdd_test_writer"
description = "RED phase agent. Writes one failing behavior test and stops before implementation."
sandbox_mode = "workspace-write"
developer_instructions = """
You own only the RED phase.
Write exactly one behavior-focused test for the requested slice.
Prefer public APIs and user-visible behavior over implementation details.
Run the smallest relevant test command.
Confirm the test fails for the expected reason.
Do not edit production implementation.
Do not add multiple tests at once.
Return Behavior, Test, Command, and RED failure reason.
"""GREEN agent
# .codex/agents/tdd-implementer.toml
name = "tdd_implementer"
description = "GREEN phase agent. Implements the minimum production code to pass the current failing test."
sandbox_mode = "workspace-write"
developer_instructions = """
You own only the GREEN phase.
Read the failing test and relevant production code.
Write the minimum implementation required to pass the current test.
Never modify, delete, skip, or weaken tests to make them pass.
Do not add speculative features, helpers, configuration, or abstractions.
Run the relevant tests and return the command plus passing output.
"""REFACTOR agent
# .codex/agents/tdd-refactorer.toml
name = "tdd_refactorer"
description = "REFACTOR phase agent. Improves structure only after tests are green."
sandbox_mode = "workspace-write"
developer_instructions = """
You own only the REFACTOR phase.
Start by running the relevant tests to confirm the code is green.
Look for duplication, unclear names, needless branching, or misplaced responsibility.
Skip refactoring when the code is already simple.
If you refactor, make one structural change at a time.
Run tests after each refactor.
Never change behavior in this phase.
"""メインセッションをコマンドする方法
按三阶段 TDD 做这个 slice:
1. tdd_test_writer 只写一个失败测试,并确认 RED。
2. 等我确认后,tdd_implementer 写最小实现,并确认 GREEN。
3. tdd_refactorer 判断是否需要结构重构。
不要批量铺测试。
不要在 GREEN 阶段修改测试。ここでのポイントは、コンテキストを分離することです。テストを作成する人は、実装の詳細に影響されないようにする必要があります。実装を作成する人は手動でテストできません。リファクタリングを行う人は新しい動作を導入できません。
5. L4: フックを使用してテストの差分に焦点を当てる
ルールのみに依存している場合でも、モデルが範囲外になる可能性があります。
最も一般的なクロスボーダーは、テストが赤であり、モデルがテストを変更して緑に変えることです。
フックの価値は「絶対に安全」であることではなく、このアクションを即座に公開することです。
Codex フックを有効にする
まず、設定内の機能フラグを開きます。
# ~/.codex/config.toml 或 <repo>/.codex/config.toml
[features]
codex_hooks = trueCodex は、アクティブな構成レイヤーの隣にあるフックを探します。一般的な場所:
~/.codex/hooks.json~/.codex/config.toml<repo>/.codex/hooks.json<repo>/.codex/config.toml
プロジェクト レベルでは、ウェアハウスに従うことができるため、最初に <repo>/.codex/hooks.json を使用することをお勧めします。
hooks.json
{
"hooks": {
"PostToolUse": [
{
"matcher": "apply_patch|Edit|Write",
"hooks": [
{
"type": "command",
"command": "bash \"$(git rev-parse --show-toplevel)/.codex/hooks/watch-test-edits.sh\"",
"timeout": 10,
"statusMessage": "Checking test file edits"
}
]
},
{
"matcher": "Bash|apply_patch|Edit|Write",
"hooks": [
{
"type": "command",
"command": "bash \"$(git rev-parse --show-toplevel)/.codex/hooks/run-fast-check.sh\"",
"timeout": 120,
"statusMessage": "Running fast checks"
}
]
}
]
}
}テストファイルが変更されているかどうかを確認します
# .codex/hooks/watch-test-edits.sh
#!/usr/bin/env bash
set -euo pipefail
changed_tests="$(
git diff --name-only |
grep -E '(^|/)(__tests__|tests?)/|\.(test|spec)\.[cm]?[jt]sx?$|_test\.go$|test_.*\.py$' || true
)"
if [ -n "$changed_tests" ]; then
cat <<EOF
{
"continue": false,
"stopReason": "Test files changed. Review before continuing.",
"systemMessage": "检测到测试文件被修改:\n$changed_tests\n\n测试文件可以改,但必须说明为什么改。先停下来确认:这是补充规格,还是为了凑绿而改测试?"
}
EOF
fi簡単なチェックを実行する
# .codex/hooks/run-fast-check.sh
#!/usr/bin/env bash
set -euo pipefail
root="$(git rev-parse --show-toplevel)"
cd "$root"
if [ -f pyproject.toml ] || [ -f pytest.ini ] || [ -d tests ]; then
pytest
elif [ -f package.json ]; then
if npm run | grep -q "types:check"; then
npm run types:check
elif npm run | grep -q "check"; then
npm run check
fi
elif [ -f go.mod ]; then
go test ./...
fiフックを神格化しないでください
フックはガードレールであり、完全な施行境界ではありません。
一般的なパスを思い出させたりブロックしたりすることはできますが、レビュー、CI、人間の判断に代わることはできません。特にテストを本当に変更する必要がある場合、正しいアプローチはテストを永久に禁止するのではなく、モデルの説明を要求することです。
为什么要改测试?
这是新需求、新边界,还是旧测试写错?
生产实现有没有被同步验证?6. TDD-Guard についてどう思いますか?
TDD-Guard は一見の価値がありますが、Codex のインストールに関する提案として受け取らないでください。
クロードコードプラグインルートです。中心的なアイデアは、AI が TDD に違反するのを防ぐこと、特に環境に優しいテストを変更するのを防ぐことです。
Codex に移行する場合、パスをコピーする代わりにアイデアを借用できます。
| クロード・コード・ルート | コーデックスルート |
|---|---|
CLAUDE.md | AGENTS.md |
.claude/agents/*.md | .codex/agents/*.toml |
| Claude プラグイン/TDD-Guard | フック + git diff チェック + CI |
| スラッシュコマンド | スキルまたはプロンプト |
Codex 側のより現実的な組み合わせは次のとおりです。
AGENTS.md 写纪律
skill 固化流程
subagents 隔离角色
hooks 检查测试 diff
CI 做最后兜底これは必須の境界とまったく同じではありませんが、個々のプロジェクトやほとんどのチーム プロジェクトには十分です。
7. 完全なチュートリアル: slugify
次に、小さな関数を実行してみましょう。
要件:
实现 slugify(text: string): string。
把英文标题转成 URL slug。この例は小さいと思わないでください。 TDD は小さな例からリズムを理解する必要があります。
ステップ 0: コードを書かずに、最初に境界について尋ねます。
Codex は急いで次のように書かないでください。
我想实现 slugify(text: string): string。
先不要写代码。
请先问我 5 个边界问题,覆盖大小写、空格、标点、unicode、空字符串。
然后把确认后的规格写成 SPEC.md。仕様は次のとおりです。
# slugify SPEC
- "Hello World" -> "hello-world"
- trim leading/trailing spaces
- collapse repeated spaces into one hyphen
- remove punctuation
- normalize "Café" -> "cafe"
- empty input returns empty stringステップ 1: 最初の赤信号
读取 SPEC.md。
只实现第一条行为:"Hello World" -> "hello-world"。
先 RED:只写一个失败测试,运行它,确认失败。
不要写生产实现。理想的な出力:
Behavior: basic title becomes lowercase hyphenated slug
Test: tests/test_slugify.py
Command: pytest tests/test_slugify.py -q
RED: failed because slugify is not definedそうして初めて続行できるのです。
ステップ 2: 最小限の緑
goCodex は最小限の実装を記述します。
def slugify(text: str) -> str:
return text.lower().replace(" ", "-")次に、次のように報告します。
GREEN: pytest tests/test_slugify.py -q passed
REFACTOR: skipped, implementation is still simple
Next slice: trim leading/trailing spacesステップ 3: 2 番目の赤信号
继续下一条:去掉首尾空格。
先 RED,只写一个测试。テスト:
def test_slugify_trims_spaces():
assert slugify(" Hello World ") == "hello-world"現在の実装が -hello-world- を出力する場合、赤信号は true です。
次に、緑:
def slugify(text: str) -> str:
return text.strip().lower().replace(" ", "-")ステップ 4: 抽象化を急がない
この時点で、多くの AI は normalizeInput、removePunctuation、toAscii を描画したいと考えます。
まだ急がないでください。
TDD の設計は、想像力ではなく、テストのプレッシャーによって押し出される必要があります。 Unicode、句読点、空の文字列を追加し、構造上の圧力が実際に発生するまで待ってから、リファクタリングを行ってください。
8. 毎日の使用状況のクイックチェック
新機能
用 TDD 实现这个需求。
每轮只处理一个行为。
先写一个失败测试并运行确认 RED。
不要写生产实现,直到我说 go。バグを修正
先写一个能复现这个 bug 的失败测试。
确认它因为这个 bug 失败后,再写最小修复。
不要改测试来适配当前实现。複雑な関数
先不要写代码。
请给出 TDD 分解计划:
- 外圈集成测试是什么
- 内圈每个行为 slice 是什么
- 每轮用什么命令验证
- 哪些地方不能 mock
等我确认后再开始 RED。Review
Review 这次改动,重点看:
- 是否先有失败测试
- 测试是否测行为而不是实现
- 是否存在为了通过而弱化测试
- 结构改动和行为改动是否混在一起
- 是否缺少外圈集成测试9. 最終チェックリスト
Codex に TDD を依頼するたびに、この表を使用して最後に確認してください。
| 質問 | 資格基準 |
|---|---|
| まず本当に人気があるのか | 失敗したコマンドと失敗の理由はありますか。 |
| 赤い色は正しいですか | 失敗の理由は、ターゲット動作の欠如に対応します。 |
| ラウンドごとに 1 つの動作だけを行う | バッチテストなし |
| 緑 テストは変更されましたか? | 緑色になるように変更されたテストはありません。 |
| テストは動作をテストしますか?内部実装の詳細に依存しない | |
| 混合動作はリファクタリングされましたか | 構造的変化と行動的変化を分けて考える |
| 完全な検証は行われていますか | 対象のテストと必要な完全な検査が実行されています。 |
このテーブルが通過できない場合は、急いでマージしないでください。
推奨リソース
AGENTS.md
Official guide to global, project, and nested instruction files.
Agent Skills
Official guide to packaging reusable workflows as skills.
Subagents
Official guide to custom agents and subagent workflows.
Codex Hooks
Official guide to deterministic scripts during the Codex lifecycle.
TDD-Guard: Automated TDD enforcement for Claude Code
Claude Code plugin route for TDD enforcement. Codex users should borrow the guardrail idea, not the install path.