November 29, 2025 (8mo ago) — last updated June 2, 2026 (2mo ago)

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

Aprende el ciclo Red‑Green‑Refactor de TDD con ejemplos en React y TypeScript, flujo paso a paso y beneficios para reducir errores y acelerar entregas.

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

El ciclo Red‑Green‑Refactor de TDD convierte requisitos grandes en pasos pequeños y verificables: escribe una prueba que falle, añade el mínimo código para que pase y refactoriza con seguridad. Esta guía muestra el flujo, ejemplos prácticos con React y TypeScript y los beneficios de negocio respaldados por estudios.1

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

Resumen: Domina el ciclo Red‑Green‑Refactor de Test‑Driven Development (TDD) con un flujo práctico, ejemplos en React y TypeScript, y beneficios claros para la calidad y la predictibilidad del negocio.

Introducción

El ciclo Red‑Green‑Refactor de Test‑Driven Development (TDD) convierte requisitos grandes en pasos pequeños y verificables. Primero se escribe una prueba que falle (Red), luego se añade el mínimo código necesario para que pase (Green) y, con las pruebas en verde, se refactoriza para mejorar la calidad interna. Esta disciplina reduce errores, guía el diseño y facilita cambios seguros en el tiempo, además de estar respaldada por estudios y reportes de la industria1.

Ritmo y propósito del desarrollo guiado por pruebas

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 suposiciones y fomenta avances pequeños y deliberados. El ciclo Red‑Green‑Refactor se convierte en el latido del desarrollo confiable.

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; su adopción se refleja en reportes sectoriales sobre agilidad y calidad1.

TDD en acción: ejemplo con React y TypeScript

A continuación veremos el ciclo en la práctica con un componente UI: LikeButton usando TypeScript, React y Jest. El ejemplo muestra cómo TDD guía el diseño y 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

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. Asimismo, prácticas de CI/CD y DevOps mejoran la predictibilidad y la estabilidad del despliegue3.

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 que reduce regresiones y disminuye el tiempo dedicado a retrabajos. El efecto es un coste total de propiedad del software menor a largo plazo2.

Acelerar la incorporación y mejorar la predictibilidad

Una suite de pruebas funciona como documentación ejecutable. Los desarrolladores nuevos pueden ejecutar las pruebas para entender el comportamiento del sistema, reduciendo el tiempo de incorporación y la dependencia en ingenieros senior. Dividir el trabajo en ciclos cortos y probados mejora la predictibilidad 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 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

Adoptar TDD implica cambios culturales y técnicos. 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 mejoras pueden notarse en pocas iteraciones.

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

Q&A rápidas (preguntas prácticas al final)

¿Cómo comenzar si el código actual no tiene pruebas?

Comienza con pruebas de caracterización en áreas críticas, luego introduce TDD en nuevas funcionalidades; prioriza piezas que más impacto tienen en producción.

¿Qué herramientas recomiendo para UI en React?

Usa Testing Library para pruebas centradas en comportamiento y Jest como corredor; emplea mocks para dependencias externas y reserva pruebas E2E para flujos completos.

¿Cómo medir el impacto de TDD en mi equipo?

Monitorea métricas como tasa de fallos en producción, tiempo medio de resolución de incidentes y frecuencia de regresiones; compara líneas base antes y después de la adopción.

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.

TDD: Ciclo Red‑Green‑Refactor — Guía práctica | Clean Code Guy