TDD en Java desde cero: cómo las pruebas cambian el código y salvan los nervios

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Por qué TDD no se trata de "escribir pruebas", sino de "pensar de otra manera"

\n\n

Imagine que está construyendo una casa. Tiene planos, materiales y un equipo. Pero empieza a colocar ladrillos sin haber revisado los cimientos. Un mes después, descubre que las paredes tienen grietas. ¿Le suena familiar? En programación, esto se llama "lo arreglamos después". Y ese "después" suele llegar a las 3 de la mañana antes del despliegue.

\n\n

El desarrollo guiado por pruebas (TDD — Test-Driven Development) es una técnica que pone el proceso patas arriba. No escribe código y luego pruebas. Primero escribe la prueba, y solo después el código que pasa esa prueba. ¿Suena una locura? En la práctica, ahorra horas, nervios y hace que el código sea más limpio que el aire de la mañana en la montaña.

\n\n

En este artículo, analizaremos TDD en Java con ejemplos concretos. Sin rodeos: solo código, el ciclo Red-Green-Refactor y escenarios reales. ¡Allá vamos!

\n\n

¿Qué es TDD y cómo funciona el ciclo Red-Green-Refactor?

\n\n

TDD se basa en tres pasos simples que se repiten cíclicamente:

\n\n
    \n
  • Red — escribimos una prueba que no pasa (debe fallar).
  • \n
  • Green — escribimos el código mínimo para que la prueba pase.
  • \n
  • Refactor — mejoramos el código sin cambiar su comportamiento. Las pruebas permanecen en verde.
  • \n
\n\n

Parece que esto ralentiza el desarrollo. En realidad, lo acelera. Deja de preguntarse "¿esto funciona?". Usted lo sabe: funciona, porque la prueba está en verde.

\n\n

Principios principales de TDD

\n
    \n
  • No escriba ni una línea de código de producción sin una prueba.
  • \n
  • La prueba debe ser lo más simple posible y verificar exactamente un comportamiento.
  • \n
  • El código se escribe solo lo suficiente para que la prueba pase. Nada de "y ya que estamos, agreguemos esto por si acaso".
  • \n
\n\n

Ahora pasemos a Java y JUnit 5, el framework más popular para pruebas unitarias.

\n\n

Configuración del proyecto: Maven, JUnit 5 y estructura

\n\n

Para los ejemplos, usaremos Maven. Agregue la dependencia en pom.xml:

\n\n
<dependency>\n    <groupId>org.junit.jupiter</groupId>\n    <artifactId>junit-jupiter-api</artifactId>\n    <version>5.10.0</version>\n    <scope>test</scope>\n</dependency>
\n\n

La estructura de carpetas es estándar para Maven:

\n
src/\n  main/java/com/example/\n  test/java/com/example/
\n\n

Todas las clases de prueba se colocan en src/test/java. El nombre de la clase de prueba generalmente coincide con el nombre de la clase que se prueba + el sufijo Test. Por ejemplo, Calculator → CalculatorTest.

\n\n

Primer ciclo TDD: escribimos una calculadora desde cero

\n\n

Tarea: crear el método add(int a, int b) que devuelva la suma. Con TDD, comenzamos no con la clase, sino con la prueba.

\n\n

Paso 1: Red — escribimos una prueba que fallará

\n\n
import org.junit.jupiter.api.Test;\nimport static org.junit.jupiter.api.Assertions.*;\n\npublic class CalculatorTest {\n\n    @Test\n    void shouldAddTwoNumbers() {\n        Calculator calc = new Calculator();\n        int result = calc.add(2, 3);\n        assertEquals(5, result);\n    }\n}
\n\n

Intentamos ejecutarlo: el compilador se queja: la clase Calculator no existe. Excelente, la luz roja está encendida.

\n\n

Paso 2: Green — escribimos el código mínimo

\n\n

Creamos la clase Calculator con un método que simplemente devuelve la suma:

\n\n
public class Calculator {\n    public int add(int a, int b) {\n        return a + b;\n    }\n}
\n\n

Ejecutamos la prueba — verde. La implementación mínima posible funcionó.

\n\n

Paso 3: Refactor

\n\n

En esta etapa, el código ya es simple, no hay nada que refactorizar. Pero imaginemos que queremos renombrar el método o agregar una verificación de desbordamiento. Lo hacemos, y la prueba sigue pasando. Si algo se rompe, la prueba fallará e indicará inmediatamente el problema.

\n\n

Compl

Blogs

Book Recommendations