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á |