Ir al contenido principal
TDD en la era de la IA
TDD en la era de la IA: Manual práctico del Codex 的文章封面图

TDD en la era de la IA: Manual práctico del Codex

Asistido por IA

Convierta TDD en un flujo de trabajo reproducible en Codex: use AGENTS.md para escribir disciplinas de proyectos, use habilidades para solidificar la refactorización roja y verde, use subagentes para aislar etapas y use ganchos para verificar las diferencias de prueba.

Dame un mapa primero

Concepto De qué se trata: En la programación de IA, el valor de TDD no es el ritual de “escribir una prueba primero”, sino crear primero una luz roja verificable y luego dejar que la implementación la ponga en verde.

Este artículo habla sobre cómo implementar Codex.

No preguntes "qué documentos necesito que coincidan" de inmediato. Una mejor pregunta es:

¿Cómo hago para que Codex actúe siempre con el mismo flujo de trabajo TDD?

Este flujo de trabajo se puede dividir en cuatro niveles:

| Jerarquía | ¿Qué estás haciendo? Dónde | ¿Cuándo es apropiado? |------|------------|----------|--------------| | L1 | Escribir disciplinas del proyecto | AGENTS.md | Todos los proyectos deberían tener | | L2 | Proceso de solidificación | .agents/skills/tdd-codex/SKILL.md | Utilice TDD repetidamente para cumplir con los requisitos | | L3 | Etapa de aislamiento | .codex/agents/*.toml | Tareas complejas, miedo a una contaminación mutua entre las pruebas y la implementación | | L4 | Recordatorio automático | .codex/hooks.json | Importante almacén, temeroso de que la IA modifique en secreto la prueba |

Las versiones más pequeñas disponibles son L1 + L2.

La línea de defensa completa es L1 + L2 + L3 + L4.

1. Primero defina qué es "finalización"

Si no existen estándares de finalización, el Codex puede fácilmente tratar el "código escrito" como "hecho".

En un escenario TDD, los criterios de finalización deberían ser más específicos.

Se deben entregar pruebas en cada ronda

Haga que Codex informe estos seis elementos en cada ronda:

Behavior: 这一轮实现哪个行为
Test: 测试文件和测试名
Command: 跑了什么命令
RED: 失败原因是否符合预期
GREEN: 通过结果是什么
REFACTOR: 是否重构,为什么

Esto es mucho más útil que un "hecho".

Le permite saber que el modelo realmente ha pasado por los ciclos rojo y verde, en lugar de escribir la implementación primero y luego agregar una prueba que parece razonable.

Solo se procesa un comportamiento en una ronda

Esto es fundamental.

No permita que Codex genere toda la matriz de prueba a la vez. Sería una "prueba de colocación horizontal":

RED: test1, test2, test3, test4, test5
GREEN: 一次写一个大实现

Lo que quieres es cortarlo a lo largo:

RED test1 -> GREEN impl1 -> REFACTOR
RED test2 -> GREEN impl2 -> REFACTOR
RED test3 -> GREEN impl3 -> REFACTOR

La primera ronda de implementación cambiará su comprensión del problema. No escribas todas tus pruebas de una sola vez.

2. L1: escribir disciplina en AGENTS.md

AGENTS.md es el archivo de descripción que Codex leerá al ingresar al proyecto.

La documentación oficial de OpenAI indica que Codex primero leerá la descripción global y luego la leerá desde el directorio raíz del proyecto hasta el directorio actual. Cada capa lee primero AGENTS.override.md; de lo contrario, lee AGENTS.md. Las descripciones más cercanas al directorio actual aparecen más tarde y, por lo tanto, tienen mayor prioridad. El límite de combinación predeterminado es 32 KiB, por lo que no se puede escribir un tutorial largo aquí.

Debería ser como las reglas de tráfico del proyecto.

AGENTS.md no es responsable de enseñarle a Codex qué es TDD. Sólo es responsable de escribir claramente: qué comportamiento no está permitido en este proyecto.

Puedes poner este párrafo directamente:

# 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.

Comandos de proyecto adicionales:

# 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.

No debería escribirse como una enciclopedia.

Un AGENTS.md incorrecto estaría lleno de:

  • Historia de TDD
  • Todas las filosofías de prueba.
  • Un montón de tutoriales de marco.
  • Plantillas de mensajes complejas
  • Especificaciones completas en diferentes idiomas.

Estas cosas diluyen las reglas que realmente importan.

Mi sugerencia es: AGENTS.md Poner sólo disciplinas residentes. Utilice habilidades para procesos largos.

3. L2: Convertir el proceso en Codex Skill

AGENTS.md resuelve "disciplina predeterminada" y la habilidad resuelve "proceso completo".

Cuando suele decir "hágalo por TDD" al Codex, debe actualizar esta oración a una habilidad a nivel de proyecto.

Estructura del directorio

Ponlo aquí:

.agents/
  skills/
    tdd-codex/
      SKILL.md

Codex escaneará desde el directorio actual hasta .agents/skills. Las habilidades en el directorio raíz del almacén son adecuadas para los flujos de trabajo utilizados por el equipo.

HABILIDAD mínima disponible.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étodo de llamada

A partir de ahora puedes decir:

用 tdd-codex skill 做这个需求。
每轮只处理一个行为。
先 RED,确认失败后停下来,不要直接写实现。

O más corto:

用 tdd-codex。先写红灯,等我说 go。

El punto no es lo hermoso que es el mensaje, sino que hace que Codex vuelva al mismo camino cada vez.

4. L3: Utilice subagentes para aislar la reconstrucción roja y verde

No todas las tareas requieren subagentes.

Sin embargo, cuando las tareas son complejas, las pruebas se contaminan fácilmente con la implementación y la refactorización es fácil de salirse de control, será más estable dividir ROJO, VERDE y REFACTOR en diferentes agentes.

¿Cuándo vale la pena desmantelar?

Adecuado para desmontaje:

  • Permisos, facturación, máquina de estados. -Funcionalidad de múltiples módulos
  • El error está muy oculto, por lo que primero debes escribir una prueba de recurrencia.
  • El modelo siempre se cambia para probar y ponerse verde.
  • Quiere a alguien que solo sea responsable de revisar la calidad de las pruebas.

No apto para desmontaje:

  • Funciones de gadget
  • Cambios de redacción
  • Puro ajuste visual
  • guión único

El costo de derribar a un agente es real. Úselo sólo cuando los beneficios del aislamiento superen los costos de la comunicación.

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.
"""

Cómo ordenar la sesión principal

按三阶段 TDD 做这个 slice:
1. tdd_test_writer 只写一个失败测试,并确认 RED。
2. 等我确认后,tdd_implementer 写最小实现,并确认 GREEN。
3. tdd_refactorer 判断是否需要结构重构。
不要批量铺测试。
不要在 GREEN 阶段修改测试。

El punto aquí es aislar el contexto. Las personas que escriben pruebas deberían intentar no verse afectadas por los detalles de implementación; las personas que escriben implementaciones no pueden realizar pruebas manualmente; las personas que refactorizan no pueden introducir nuevos comportamientos.

5. L4: Utilice ganchos para centrarse en la diferencia de prueba

Si confía únicamente en las reglas, es posible que el modelo aún se salga de los límites.

El transfronterizo más común es: la prueba es roja y el modelo cambia la prueba para volverla verde.

El valor de los ganchos no es ser "absolutamente seguro", sino exponer esta acción de inmediato.

Habilitar ganchos del Codex

Primero abra la bandera de función en la configuración:

# ~/.codex/config.toml 或 <repo>/.codex/config.toml
[features]
codex_hooks = true

Codex busca enlaces junto a la capa de configuración activa. Ubicaciones comunes:

  • ~/.codex/hooks.json
  • ~/.codex/config.toml
  • <repo>/.codex/hooks.json
  • <repo>/.codex/config.toml

A nivel de proyecto, se recomienda utilizar <repo>/.codex/hooks.json primero, porque puede seguir el almacén.

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"
          }
        ]
      }
    ]
  }
}

Compruebe si el archivo de prueba ha sido modificado

# .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

Ejecute una verificación rápida

# .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

No deifiques los anzuelos

Los ganchos son barandillas, no límites de aplicación total.

Puede recordar y bloquear caminos comunes, pero no puede reemplazar la revisión, la IC y el juicio humano. Especialmente cuando la prueba realmente necesita modificarse, el enfoque correcto no es prohibirla para siempre, sino exigir una explicación del modelo:

为什么要改测试?
这是新需求、新边界,还是旧测试写错?
生产实现有没有被同步验证?

6. ¿Qué opinas de TDD-Guard?

Vale la pena echarle un vistazo a TDD-Guard, pero no lo tome como una sugerencia de instalación del Codex.

Es la ruta del complemento Claude Code. La idea central es evitar que la IA viole TDD, especialmente para evitar cambiar las pruebas para que se vuelvan verdes.

Al migrar a Codex, puede tomar prestadas ideas en lugar de copiar la ruta.

Ruta del Código ClaudeRuta del Códice
CLAUDE.mdAGENTS.md
.claude/agents/*.md.codex/agents/*.toml
Complemento Claude/TDD-Guardganchos + git diff check + CI
comando de barra diagonalhabilidad o indicación

Una combinación más realista por parte del Codex es:

AGENTS.md 写纪律
skill 固化流程
subagents 隔离角色
hooks 检查测试 diff
CI 做最后兜底

Este no es el equivalente exacto de un límite obligatorio, pero es suficiente para proyectos individuales y la mayoría de proyectos de equipo.

7. Tutorial completo: slugify

Ahora revíselo con una pequeña función.

Requisitos:

实现 slugify(text: string): string。
把英文标题转成 URL slug。

No creas que este ejemplo es pequeño. TDD debe comprender el ritmo a partir de pequeños ejemplos.

Paso 0: primero pregunte sobre los límites, sin escribir código

Que el Codex no se apresure a escribir:

我想实现 slugify(text: string): string。
先不要写代码。
请先问我 5 个边界问题,覆盖大小写、空格、标点、unicode、空字符串。
然后把确认后的规格写成 SPEC.md。

Las especificaciones pueden ser:

# 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

Paso 1: Primera luz roja

读取 SPEC.md。
只实现第一条行为:"Hello World" -> "hello-world"。
先 RED:只写一个失败测试,运行它,确认失败。
不要写生产实现。

Salida ideal:

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

Sólo entonces podrás continuar.

Paso 2: Verde mínimo

go

Codex escribe la implementación mínima:

def slugify(text: str) -> str:
    return text.lower().replace(" ", "-")

Luego informe:

GREEN: pytest tests/test_slugify.py -q passed
REFACTOR: skipped, implementation is still simple
Next slice: trim leading/trailing spaces

Paso 3: Segunda luz roja

继续下一条:去掉首尾空格。
先 RED,只写一个测试。

Prueba:

def test_slugify_trims_spaces():
    assert slugify("  Hello World  ") == "hello-world"

Si la implementación actual genera -hello-world-, la luz roja es verdadera.

Luego VERDE:

def slugify(text: str) -> str:
    return text.strip().lower().replace(" ", "-")

Paso 4: No te apresures a la abstracción

En este punto, muchas IA querrán dibujar un normalizeInput, removePunctuation, toAscii.

No te apresures todavía.

El diseño de TDD debe ser impulsado por la presión de prueba, no por la imaginación. Espere hasta que agregue Unicode, puntuación y cadenas vacías, y realmente surja presión estructural, luego refactorice.

8. Comprobación rápida del uso diario

Nuevas funciones

用 TDD 实现这个需求。
每轮只处理一个行为。
先写一个失败测试并运行确认 RED。
不要写生产实现,直到我说 go。

Corregir error

先写一个能复现这个 bug 的失败测试。
确认它因为这个 bug 失败后,再写最小修复。
不要改测试来适配当前实现。

Funciones complejas

先不要写代码。
请给出 TDD 分解计划:
- 外圈集成测试是什么
- 内圈每个行为 slice 是什么
- 每轮用什么命令验证
- 哪些地方不能 mock
等我确认后再开始 RED。

Review

Review 这次改动,重点看:
- 是否先有失败测试
- 测试是否测行为而不是实现
- 是否存在为了通过而弱化测试
- 结构改动和行为改动是否混在一起
- 是否缺少外圈集成测试

9. Lista de verificación final

Cada vez que le pida al Codex que haga TDD, utilice esta tabla para comprobarlo al final.

PreguntaCriterios de elegibilidad
¿Es realmente popular primero? ¿Hay comandos fallidos y motivos del fracaso?
¿Es correcto el color rojo? El motivo del fracaso corresponde a la falta de comportamiento objetivo
Haz solo un comportamiento por rondaSin pruebas por lotes
VERDE ¿Se ha cambiado la prueba?No se ha modificado ninguna prueba para ser verde
¿Las pruebas prueban el comportamiento? No depende de detalles de implementación interna
¿Se han refactorizado los comportamientos mixtos? Separar cambios estructurales y cambios de comportamiento
¿Existe una verificación completa? Se han realizado pruebas específicas y las inspecciones completas necesarias

Si esta tabla no puede pasar, no se apresure a fusionarse.

Recursos recomendados

AGENTS.md

Official guide to global, project, and nested instruction files.

OpenAIOpenAI Developers
Visitar

Agent Skills

Official guide to packaging reusable workflows as skills.

OpenAIOpenAI Developers
Visitar

Subagents

Official guide to custom agents and subagent workflows.

OpenAIOpenAI Developers
Visitar

Codex Hooks

Official guide to deterministic scripts during the Codex lifecycle.

OpenAIOpenAI Developers
Visitar
Red Green Refactor is OP With Claude Code
Vídeo corto de Matt Pocock. El título conserva el nombre original, centrándose en el ritmo de rojo/verde/refactor.YouTube

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.

nizosGitHub
Visitar

Comentarios

Tabla de contenidos

TDD en la era de la IA: Manual práctico del Codex | El Escritorio Cyber de Yu