November 29, 2025 (4mo ago) — last updated December 26, 2025 (3mo ago)

Ciclo Red‑Green‑Refactor (TDD): Guía práctica

Aprende el ciclo Red‑Green‑Refactor de TDD con ejemplos prácticos, flujo paso a paso y beneficios para crear código más limpio y mantenible.

← Back to blog
Cover Image for Ciclo Red‑Green‑Refactor (TDD): Guía práctica

El ciclo Red‑Green‑Refactor de TDD transforma requisitos grandes en pasos pequeños y verificables: escribe una prueba que falle, hazla pasar con el mínimo código y refactoriza. Esta guía te muestra el flujo, ejemplos prácticos con React y TypeScript, y cómo TDD aporta calidad y predictibilidad al negocio.

Ciclo Red‑Green‑Refactor (TDD): Guía práctica

Resumen: Domina el ciclo Red‑Green‑Refactor de Test‑Driven Development (TDD) con un flujo de trabajo práctico, ejemplos y beneficios para el negocio para construir código más limpio y mantenible.

Introducción

El ciclo Red‑Green‑Refactor de Test‑Driven Development (TDD) es un flujo de trabajo disciplinado que convierte la incertidumbre en pasos pequeños y verificables. Empieza escribiendo una prueba que falla (Red), añade el código mínimo para que pase (Green) y, con las pruebas en verde, mejoras la implementación (Refactor). Esta cadencia no solo reduce errores, sino que guía el diseño y facilita cambios seguros en el futuro.

Ritmo y propósito del Desarrollo Guiado por Pruebas

Un diagrama dibujado a mano que ilustra el ciclo Red-Green-Refactor para el flujo de trabajo de Test-Driven Development (TDD).

TDD es, ante todo, una práctica de diseño. Escribir la prueba primero obliga a pensar en la API pública y en cómo se usará el código antes de implementarlo. Eso reduce conjeturas y fomenta avances pequeños y deliberados. El ciclo Red‑Green‑Refactor se convierte en el latido del desarrollo fiable.

Las tres etapas y su intención

  • Fase Red (prueba fallida): Escribe una prueba automatizada que represente el comportamiento útil más pequeño. La prueba debe fallar para validar que el requisito está correctamente definido.
  • Fase Green (hacer que pase): Implementa la cantidad mínima de código para satisfacer la prueba. Prioriza la simplicidad y evita sobre‑ingeniería.
  • Fase Refactor (mejorar internals): Con las pruebas en verde, limpia nombres, elimina duplicación y mejora la estructura sin cambiar el comportamiento.

El paso de refactorización es obligatorio. Saltárselo acumula deuda técnica y dificulta cambios futuros.

Resumen rápido del ciclo

FasePropósitoObjetivo del desarrollador
RedDefinir el requisito y validar la pruebaEscribir una prueba pequeña que falle
GreenSatisfacer el requisitoAñadir el código mínimo para pasar la prueba
RefactorMejorar la calidad internaLimpiar duplicación y aclarar la intención

Adoptar esta cadencia ayuda a los equipos a avanzar de forma predecible y con confianza. En muchas organizaciones TDD forma parte de la práctica diaria y su adopción se refleja en reportes sectoriales sobre agilidad y calidad1.

Recorrido por el ciclo TDD en acción

Un diagrama manuscrito que ilustra un flujo de proceso con un icono de corazón rojo, un cuadro de texto y un icono de círculo verde.

A continuación veremos el ciclo en la práctica con un ejemplo de UI: un componente LikeButton usando TypeScript, React y Jest. El ejemplo muestra cómo TDD guía el diseño mientras mantiene el comportamiento predecible.

Fase Red: definir el primer requisito

El requisito más simple es que el componente se renderice sin errores y muestre “Like”. Escribimos la prueba antes del componente:

// LikeButton.test.tsx
import React from "react";
import { render, screen } from "@testing-library/react";
import LikeButton from "./LikeButton";

describe("LikeButton", () => {
  it("renders a button with the initial text \"Like\"", () => {
    render(<LikeButton />);
    const likeButton = screen.getByRole("button", { name: /like/i });
    expect(likeButton).toBeInTheDocument();
  });
});

Al ejecutar la prueba falla porque el componente aún no existe. Esa es la fase Red, y es exactamente lo que buscamos.

Fase Green: lo mínimo para pasar

Creamos el componente mínimo que satisface la prueba:

// LikeButton.tsx
import React from "react";

const LikeButton = () => {
  return <button>Like</button>;
};

export default LikeButton;

Al ejecutar las pruebas, pasan. Objetivo cumplido para este ciclo.

Fase Refactor: pulir la implementación

Con las pruebas en verde, mejoramos la implementación añadiendo tipos y estableciendo un patrón para futuras ampliaciones:

// LikeButton.tsx (refactorizado)
import React, { FC } from "react";

type LikeButtonProps = {};

const LikeButton: FC<LikeButtonProps> = () => {
  return <button>Like</button>;
};

export default LikeButton;

Las pruebas siguen pasando. La red de seguridad permite mejorar el código con confianza.

Iteración: comportamiento al hacer clic

Nuevo requisito: al hacer clic, el texto cambia a “Liked” y el botón se deshabilita. Empieza con una prueba fallida:

// LikeButton.test.tsx
it("changes text to \"Liked\" and becomes disabled when clicked", () => {
  render(<LikeButton />);
  const likeButton = screen.getByRole("button", { name: /like/i });
  fireEvent.click(likeButton);
  expect(likeButton).toHaveTextContent("Liked");
  expect(likeButton).toBeDisabled();
});

Implementa el comportamiento mínimo:

// LikeButton.tsx
import React, { FC, useState } from "react";

type LikeButtonProps = {};

const LikeButton: FC<LikeButtonProps> = () => {
  const [liked, setLiked] = useState(false);
  const handleClick = () => setLiked(true);
  return (
    <button onClick={handleClick} disabled={liked}>
      {liked ? "Liked" : "Like"}
    </button>
  );
};

export default LikeButton;

Ejecuta la suite: todo en verde. Repite este bucle: un requisito pequeño a la vez, protegido por pruebas.

Beneficio de negocio: por qué invertir en calidad

Una balanza dibujada a mano comparando el desarrollo de software sin TDD (muchos bugs, pesado) con con TDD (menos problemas, más ligero).

Los beneficios técnicos de TDD se traducen en valor tangible para el negocio: menos defectos en producción, menores costos de soporte y mayor velocidad para añadir nuevas funcionalidades. Estudios empíricos han documentado reducciones significativas en defectos y en el esfuerzo de depuración para equipos que aplican TDD de forma consistente2. Además, las prácticas ágiles y de DevOps muestran que equipos con pipelines maduros obtienen mayor predictibilidad y menores tasas de fallos en cambios3.

Reducir defectos y costos de mantenimiento

Al escribir pruebas antes del código solo se añade aquello necesario para satisfacer una prueba. Esto crea una red de seguridad robusta que reduce regresiones. El efecto: menos tiempo en retrabajos y un coste total de propiedad del software menor a largo plazo2.

Acelerar la incorporación y mejorar la predictibilidad

Una suite de pruebas sirve como documentación ejecutable. Los desarrolladores nuevos pueden ejecutar las pruebas para saber cómo debe comportarse el sistema en lugar de depender de documentación estática. Esto reduce el tiempo de incorporación y la carga sobre ingenieros senior. Dividir el trabajo en ciclos cortos y probados mejora la previsibilidad en planificación y comunicación con stakeholders3.

Errores comunes de TDD y cómo evitarlos

TDD es simple de explicar pero exige práctica. Estos anti‑patrones son frecuentes y evitables.

Pruebas de integración con apariencia de unitarias

Problema: una prueba termina ejerciendo demasiadas piezas: UI, servicios, API y base de datos. Resultado: pruebas lentas y frágiles.

Solución: prueba una unidad en aislamiento. Usa mocks, stubs y fakes para dependencias externas. Si necesitas cobertura de integración, crea suites de integración separadas que se ejecuten en CI.

Una verdadera prueba unitaria no debe tocar la red, el sistema de archivos ni una base de datos real; su velocidad y fiabilidad permiten refactorizar sin miedo4.

Probar la implementación en lugar del comportamiento

Problema: las pruebas afirman detalles internos y se rompen con refactors que no afectan la API pública.

Solución: prueba la API pública y los efectos observables. Pregunta: dado este input, ¿cuál es el output esperado? Las pruebas centradas en comportamiento resisten refactors y actúan como documentación útil.

Saltarse la refactorización

Problema: tras hacer pasar la prueba, se pasa rápidamente a la siguiente funcionalidad sin limpiar el código, acumulando deuda técnica.

Solución: considera el refactor como un paso obligatorio. Con las pruebas en verde, pequeñas mejoras son seguras y mantienen la base de código fácil de cambiar.

Integrando TDD en equipos y con código legado

Un diagrama dibujado a mano que muestra desarrolladores trabajando en código legado con pruebas de caracterización y CI/CD.

Adoptar TDD implica cambios culturales y técnicas. Haz que las pruebas formen parte de la Definición de Hecho del equipo y celebra las victorias impulsadas por pruebas.

Promover TDD dentro del equipo

Prácticas efectivas para generar impulso:

  • Programación en parejas para transferir experiencia con el ciclo Red‑Green‑Refactor.
  • Mob programming en problemas complejos para compartir conocimiento.
  • Sesiones prácticas (lunch‑and‑learn) que muestren ejemplos reales en la base de código.

Empieza por pequeñas funcionalidades y deja que las ganancias tempranas convenzan al equipo.

Domar código legado con pruebas de caracterización

Cuando el código es arriesgado de cambiar, escribe pruebas de caracterización para documentar el comportamiento actual. Estas pruebas permiten refactorizar con confianza afirmando cómo se comporta el sistema hoy.

Automatizar calidad con CI/CD

Ejecuta la suite de pruebas en cada commit en CI. Esto proporciona retroalimentación inmediata, aplica puertas de calidad y hace que pasar las pruebas sea requisito antes de hacer merge. La automatización mantiene el bucle de retroalimentación rápido y fiable. Consulta guías relacionadas como Guía de pruebas unitarias y CI/CD y calidad para integrar estas prácticas.

Preguntas frecuentes

¿TDD reemplaza otros tipos de pruebas?

No. TDD se centra en pruebas unitarias como herramienta de diseño, pero aún necesitas pruebas de integración y end‑to‑end para validar interacciones y flujos completos de usuario.

¿Cómo usar TDD con bases de datos o APIs externas?

Aísla la lógica de negocio usando mocks, stubs o fakes. Prueba la lógica en una burbuja y reserva pruebas de integración para la suite separada que ejecute contra servicios reales.

¿Vale la pena testear componentes de UI simples?

Sí, cuando pruebas comportamiento y no la implementación. Verifica lo que los usuarios ven y hacen, por ejemplo que un botón renderice la etiqueta correcta o que dispare la acción al hacer clic.

Preguntas y respuestas — Resumen práctico

P: ¿Cuánto tiempo antes de ver valor con TDD?

R: El valor suele aparecer rápidamente en la reducción de regresiones y en una depuración más rápida; las primeras victorias pueden llegar en pocas iteraciones del equipo.

P: ¿Cuál es el paso más pequeño para adoptar TDD?

R: Empieza con una nueva funcionalidad pequeña o un bug no crítico: escribe una prueba que falle, implementa lo mínimo para pasar y refactoriza.

P: ¿Cómo persuadir a stakeholders para invertir en pruebas?

R: Presenta ahorro a largo plazo: menos incidentes en producción, menores costos de mantenimiento y mayor velocidad de entrega con el tiempo. Usa incidentes reales del equipo como ejemplos.

Tres preguntas y respuestas breves (recapitulación)

Q: ¿Qué es el ciclo Red‑Green‑Refactor? A: Un bucle de TDD: escribir una prueba que falle, hacerla pasar con el mínimo código y luego refactorizar.

Q: ¿Por qué seguir este ritmo? A: Porque transforma requisitos grandes en pasos pequeños, reduce riesgo y facilita cambios seguros.

Q: ¿Cuál es la regla de oro al escribir pruebas? A: Probar comportamiento observable y mantener las pruebas rápidas y aisladas.

1.
Digital.ai, “State of Agile Report,” https://digital.ai/resource-center/state-of-agile-report
2.
Basili, Victor R., et al., “An Empirical Study on the Effects of Test-Driven Development,” https://link.springer.com/article/10.1007/s10664-015-9378-2
3.
Google Cloud, “State of DevOps Report,” https://cloud.google.com/devops/state-of-devops
4.
Martin Fowler, “TestDrivenDevelopment,” https://martinfowler.com/bliki/TestDrivenDevelopment.html
← Back to blog
🙋🏻‍♂️

La IA escribe código.
Tú lo haces durar.

En la era de la aceleración de la IA, el código limpio no es solo una buena práctica — es la diferencia entre sistemas que escalan y bases de código que colapsan bajo su propio peso.