
Le TDD à l'ère de l'IA : manuel pratique du Codex
Transformez TDD en un flux de travail reproductible dans Codex : utilisez AGENTS.md pour écrire des disciplines de projet, utilisez des compétences pour solidifier la refactorisation rouge et verte, utilisez des sous-agents pour isoler les étapes et utilisez des hooks pour vérifier les différences de test.
Donnez-moi d'abord une carte
Concept De quoi s'agit-il : En programmation IA, la valeur du TDD n'est pas le rituel « d'écrire un test d'abord », mais plutôt de créer d'abord un feu rouge vérifiable, puis de laisser l'implémentation le passer au vert.
Cet article explique comment mettre en œuvre le Codex.
Ne demandez pas tout de suite « quels documents dois-je faire correspondre » ? Une meilleure question est :
Comment puis-je faire en sorte que Codex agisse à chaque fois sur le même flux de travail TDD ?
Ce flux de travail peut être divisé en quatre niveaux :
| Hiérarchie | Que fais-tu | Où | Quand est-ce approprié |
|---|---|---|---|
| L1 | Écrire les disciplines du projet | AGENTS.md | Tous les projets devraient avoir |
| L2 | Processus de solidification | .agents/skills/tdd-codex/SKILL.md | Utiliser TDD à plusieurs reprises pour répondre aux exigences |
| L3 | Étape d'isolement | .codex/agents/*.toml | Tâches complexes, crainte d'une contamination mutuelle entre tests et mise en œuvre |
| L4 | Rappel automatique | .codex/hooks.json | Entrepôt important, craignant que l'IA modifie secrètement le test |
Les plus petites versions disponibles sont L1 + L2.
La ligne de défense complète est L1 + L2 + L3 + L4.
1. Définissez d'abord ce qu'est « achèvement »
S'il n'y a pas de normes d'achèvement, le Codex peut facilement traiter le « code écrit » comme « terminé ».
Dans un scénario TDD, les critères d’achèvement devraient être plus spécifiques.
Les preuves doivent être fournies à chaque tour
Demandez au Codex de signaler ces six éléments à chaque tour :
Behavior: 这一轮实现哪个行为
Test: 测试文件和测试名
Command: 跑了什么命令
RED: 失败原因是否符合预期
GREEN: 通过结果是什么
REFACTOR: 是否重构,为什么C'est beaucoup plus utile qu'un « terminé ».
Cela vous permet de savoir que le modèle est vraiment passé par les cycles rouge et vert, au lieu d'écrire d'abord l'implémentation, puis d'ajouter un test qui semble raisonnable.
Un seul comportement est traité dans un tour
C’est crucial.
Ne laissez pas le Codex générer la totalité de la matrice de test en même temps. Cela deviendrait un « test de pose horizontale » :
RED: test1, test2, test3, test4, test5
GREEN: 一次写一个大实现Ce que vous voulez, c'est le trancher dans le sens de la longueur :
RED test1 -> GREEN impl1 -> REFACTOR
RED test2 -> GREEN impl2 -> REFACTOR
RED test3 -> GREEN impl3 -> REFACTORLe premier cycle de mise en œuvre changera votre compréhension du problème. N'écrivez pas tous vos tests en une seule fois.
2. L1 : Écrivez la discipline dans AGENTS.md
AGENTS.md est le fichier de description que Codex lira lors de la saisie du projet.
La documentation officielle d'OpenAI indique que le Codex lira d'abord la description globale, puis la lira depuis le répertoire racine du projet jusqu'au répertoire actuel. Chaque couche lit AGENTS.override.md en premier, sinon lit AGENTS.md. Les descriptions plus proches du répertoire courant apparaissent plus tard et ont donc une priorité plus élevée. La limite de fusion par défaut est 32 KiB, donc un long didacticiel ne peut pas être écrit ici.
Cela devrait ressembler aux règles de circulation du projet
AGENTS.md n'est pas responsable d'enseigner au Codex ce qu'est le TDD. Il lui appartient uniquement d'écrire clairement : quels comportements ne sont pas autorisés dans ce projet.
Vous pouvez mettre ce paragraphe directement :
# 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.Commandes de projet supplémentaires :
# 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.Cela ne devrait pas être écrit comme une encyclopédie
Un mauvais AGENTS.md serait rempli de :
- Histoire du TDD
- Toutes les philosophies de test
- Un tas de tutoriels sur le framework
- Modèles d'invites complexes
- Spécifications complètes dans différentes langues
Ces choses diluent les règles qui comptent vraiment.
Ma suggestion est la suivante : AGENTS.md Ne mettez que les disciplines des résidents. Utilisez vos compétences pour les longs processus.
3. L2 : Faire du processus une compétence Codex
AGENTS.md résout la « discipline par défaut » et la compétence résout le « processus complet ».
Lorsque vous dites souvent « faites-le par TDD » au Codex, vous devez améliorer cette phrase en une compétence au niveau du projet.
Structure du répertoire
Mettez-le ici :
.agents/
skills/
tdd-codex/
SKILL.mdCodex analysera à partir du répertoire actuel jusqu'à .agents/skills. Les compétences du répertoire racine de l'entrepôt sont adaptées aux workflows utilisés par l'équipe.
Minimum disponible 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:Méthode d'appel
A partir de maintenant, vous pouvez dire :
用 tdd-codex skill 做这个需求。
每轮只处理一个行为。
先 RED,确认失败后停下来,不要直接写实现。Ou plus court :
用 tdd-codex。先写红灯,等我说 go。Le problème n’est pas la beauté de l’invite, mais le fait qu’elle ramène le Codex sur la même voie à chaque fois.
4. L3 : Utiliser des sous-agents pour isoler la reconstruction rouge et verte
Toutes les tâches ne nécessitent pas de sous-agents.
Cependant, lorsque les tâches sont complexes, que les tests sont facilement contaminés par la mise en œuvre et que le refactoring est facile à échapper à tout contrôle, il sera plus stable de diviser RED, GREEN et REFACTOR en différents agents.
Quand vaut-il la peine d'être démonté ?
Convient pour le démontage :
- Autorisations, facturation, machine d'état -Fonctionnalité multi-modules
- Le bug est très caché, vous devez donc d'abord écrire un test de récurrence
- Le modèle est toujours modifié pour tester pour passer au vert
- Vous voulez quelqu'un qui est uniquement responsable de l'examen de la qualité des tests
Ne convient pas au démontage :
- Fonctions des gadgets
- Modifications de rédaction
- Ajustement visuel pur
- script unique
Le coût du démantèlement d’un agent est réel. À utiliser uniquement lorsque les avantages de l’isolement dépassent les coûts de la communication.
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.
"""Comment commander la session principale
按三阶段 TDD 做这个 slice:
1. tdd_test_writer 只写一个失败测试,并确认 RED。
2. 等我确认后,tdd_implementer 写最小实现,并确认 GREEN。
3. tdd_refactorer 判断是否需要结构重构。
不要批量铺测试。
不要在 GREEN 阶段修改测试。Le but ici est d’isoler le contexte. Les personnes qui écrivent des tests doivent essayer de ne pas être affectées par les détails de l'implémentation ; les personnes qui écrivent des implémentations ne peuvent pas tester manuellement ; les personnes qui refactorisent ne peuvent pas introduire de nouveaux comportements.
5. L4 : Utilisez Hooks pour vous concentrer sur les différences de test
Si vous vous fiez uniquement aux règles, le modèle peut quand même sortir des limites.
Le test transfrontalier le plus courant est le suivant : le test est rouge et le modèle modifie le test afin de le rendre vert.
La valeur des hooks n'est pas d'être "absolument sûr", mais d'exposer cette action immédiatement.
Activer les crochets du Codex
Ouvrez d'abord l'indicateur de fonctionnalité dans la configuration :
# ~/.codex/config.toml 或 <repo>/.codex/config.toml
[features]
codex_hooks = trueLe Codex recherche des hooks à côté de la couche de configuration active. Emplacements communs :
~/.codex/hooks.json~/.codex/config.toml<repo>/.codex/hooks.json<repo>/.codex/config.toml
Au niveau du projet, il est recommandé d'utiliser <repo>/.codex/hooks.json en premier, car il peut suivre l'entrepôt.
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"
}
]
}
]
}
}Vérifiez si le fichier de test a été modifié
# .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
fiEffectuez une vérification rapide
# .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 ./...
fiNe déifiez pas les crochets
les crochets sont un garde-corps et non une limite d'application complète.
Il peut rappeler et bloquer les chemins communs, mais il ne peut pas remplacer l’examen, l’IC et le jugement humain. Surtout lorsque le test doit réellement être modifié, la bonne approche n’est pas de l’interdire pour toujours, mais d’exiger une explication du modèle :
为什么要改测试?
这是新需求、新边界,还是旧测试写错?
生产实现有没有被同步验证?6. Que pensez-vous de TDD-Guard ?
TDD-Guard vaut le détour, mais ne le considérez pas comme une suggestion d'installation du Codex.
Il s'agit de la voie du plugin Claude Code. L’idée principale est d’empêcher l’IA de violer le TDD, notamment pour empêcher la modification des tests pour passer au vert.
Lors de la migration vers Codex, vous pouvez emprunter des idées au lieu de copier le chemin.
| Claude Code Itinéraire | Itinéraire du Codex |
|---|---|
CLAUDE.md | AGENTS.md |
.claude/agents/*.md | .codex/agents/*.toml |
| Plugin Claude/TDD-Guard | crochets + vérification git diff + CI |
| commande barre oblique | compétence ou invite |
Une combinaison plus réaliste du côté du Codex est :
AGENTS.md 写纪律
skill 固化流程
subagents 隔离角色
hooks 检查测试 diff
CI 做最后兜底Ce n’est pas l’équivalent exact d’une limite obligatoire, mais c’est suffisant pour les projets individuels et la plupart des projets d’équipe.
7. Procédure pas à pas complète : slugify
Parcourez-le maintenant avec une petite fonction.
Exigences :
实现 slugify(text: string): string。
把英文标题转成 URL slug。Ne pensez pas que cet exemple est petit. TDD doit comprendre le rythme à partir de petits exemples.
Étape 0 : Renseignez-vous d'abord sur les limites, sans écrire de code
Que le Codex ne se précipite pas pour écrire :
我想实现 slugify(text: string): string。
先不要写代码。
请先问我 5 个边界问题,覆盖大小写、空格、标点、unicode、空字符串。
然后把确认后的规格写成 SPEC.md。Les spécifications peuvent être :
# 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Étape 1 : Premier feu rouge
读取 SPEC.md。
只实现第一条行为:"Hello World" -> "hello-world"。
先 RED:只写一个失败测试,运行它,确认失败。
不要写生产实现。Sortie idéale :
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 definedCe n'est qu'alors que vous pourrez continuer.
Étape 2 : Vert minimal
goLe Codex écrit l'implémentation minimale :
def slugify(text: str) -> str:
return text.lower().replace(" ", "-")Signalez ensuite :
GREEN: pytest tests/test_slugify.py -q passed
REFACTOR: skipped, implementation is still simple
Next slice: trim leading/trailing spacesÉtape 3 : Deuxième feu rouge
继续下一条:去掉首尾空格。
先 RED,只写一个测试。Testez :
def test_slugify_trims_spaces():
assert slugify(" Hello World ") == "hello-world"Si l'implémentation actuelle génère -hello-world-, le voyant rouge est vrai.
Puis VERT :
def slugify(text: str) -> str:
return text.strip().lower().replace(" ", "-")Étape 4 : Ne vous précipitez pas vers l'abstraction
À ce stade, de nombreuses IA voudront dessiner un normalizeInput, removePunctuation, toAscii.
Ne vous précipitez pas encore.
La conception du TDD doit être poussée par la pression d'essai, et non par l'imagination. Attendez que vous ajoutiez de l'Unicode, de la ponctuation et des chaînes vides et que la pression structurelle apparaisse réellement, puis refactorisez.
8. Vérification rapide de l'utilisation quotidienne
Nouvelles fonctionnalités
用 TDD 实现这个需求。
每轮只处理一个行为。
先写一个失败测试并运行确认 RED。
不要写生产实现,直到我说 go。Correction d'un bug
先写一个能复现这个 bug 的失败测试。
确认它因为这个 bug 失败后,再写最小修复。
不要改测试来适配当前实现。Fonctions complexes
先不要写代码。
请给出 TDD 分解计划:
- 外圈集成测试是什么
- 内圈每个行为 slice 是什么
- 每轮用什么命令验证
- 哪些地方不能 mock
等我确认后再开始 RED。Review
Review 这次改动,重点看:
- 是否先有失败测试
- 测试是否测行为而不是实现
- 是否存在为了通过而弱化测试
- 结构改动和行为改动是否混在一起
- 是否缺少外圈集成测试9. Liste de contrôle finale
Chaque fois que vous demandez au Codex de faire du TDD, utilisez ce tableau pour vérifier à la fin.
| Question | Critères d'éligibilité |
|---|---|
| Est-ce vraiment populaire en premier | Y a-t-il des commandes qui ont échoué et les raisons de l'échec |
| La couleur rouge est-elle correcte | La raison de l'échec correspond à l'absence de comportement cible |
| Faites un seul comportement par tour | Aucun test par lots |
| VERT Le test a-t-il été modifié ? | Aucun test n'a été modifié pour passer au vert |
| Les tests testent-ils le comportement | Ne s'appuie pas sur les détails de mise en œuvre internes |
| Les comportements mixtes ont-ils été refactorisés | Séparer les changements structurels et les changements de comportement |
| Existe-t-il une vérification complète | Les tests ciblés et les inspections complètes nécessaires ont été effectués |
Si ce tableau ne peut pas être adopté, ne vous précipitez pas pour fusionner.
Ressources recommandées
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.
Commentaires
Présentation du concept
Pourquoi le TDD est-il nécessaire dans la programmation de l'IA ? Le but n'est pas formellement "d'écrire le test en premier", mais de créer un échec vérifiable avant que l'implémentation ne passe du rouge au vert.
Guide de prise en main rapide de Tmux
Apprenez Tmux, le multiplexeur de terminal, depuis le debut : concepts fondamentaux, commandes courantes et integration approfondie avec Claude Code