TDD (*Test-Driven Development*, desarrollo dirigido por pruebas) invierte el orden habitual: la prueba se escribe antes que el código que la hace pasar. El ciclo tiene tres pasos, repetidos en bucles cortos.
| Paso | Qué se hace | Resultado |
|---|---|---|
| Rojo | Escribir una prueba del comportamiento nuevo y ejecutarla | Falla: el código no existe aún |
| Verde | Escribir el código mínimo que hace pasar la prueba | Todas las pruebas pasan |
| Refactor | Mejorar el diseño sin cambiar el comportamiento | Las pruebas siguen pasando |
Rojo: la prueba describe el comportamiento que falta:
@Test void refusesExpiredProduct() { Inventory inventory = new Inventory(); assertThrows(ExpiredProductException.class, () -> inventory.add("MILK-1", LocalDate.now().minusDays(1))); }
Ejecutarla falla: Inventory no tiene ese método o no lanza la excepción.
Verde: el código mínimo para pasarla:
public void add(String code, LocalDate expiry) { if (expiry.isBefore(LocalDate.now())) { throw new ExpiredProductException(); } /* registrar el producto */ }
Refactor: mejorar nombres, extraer una constante, simplificar. Las pruebas protegen cada cambio.
Refactorizar es cambiar la estructura del código sin cambiar su comportamiento: extraer un método, renombrar, eliminar duplicación. Es el tercer paso del ciclo y depende de las pruebas: sin ellas, un refactor puede introducir errores invisibles.
En la práctica, el asistente de IA puede proponer los cambios de refactorización; las pruebas son quienes comprueban que el comportamiento no ha cambiado.
| Encaja bien | Encaja peor |
|---|---|
| Lógica de negocio con reglas claras | Código de interfaz, configuración |
| Algoritmos y cálculos | Exploración y prototipos |
| Corrección de errores: la prueba que reproduce el bug primero | Código efímero que se descartará |