Skip to content
IRC-CodingIRC-Coding
TDDTest Driven DevelopmentRed Green RefactorUnit TestsAgile DevelopmentClean Code

Test Driven Development: Ciclo Red-Green-Refactor

Aprende TDD con el ciclo Red-Green-Refactor. Ventajas, desafíos, mejores prácticas y ejemplos prácticos de desarrollo dirigido por tests.

S

schutzgeist

5 min read
Test Driven Development: Ciclo Red-Green-Refactor

Test Driven Development: Red-Green-Refactor

Test Driven Development, o TDD, es una práctica de desarrollo en la que los tests se escriben antes que el código de producción. El famoso ciclo Red-Green-Refactor obliga a los desarrolladores a pensar en el comportamiento deseado antes de implementar. El resultado suele ser código mejor, más testeable y más enfocado.

En pocas palabras

  • TDD escribe los tests antes del código de producción.
  • El ciclo consta de Red, Green y Refactor.
  • Red: escribe un test que falla.
  • Green: código mínimo para que pase el test.
  • Refactor: mejora el código sin cambiar el comportamiento.
  • TDD fomenta pasos pequeños, requisitos claros y código testeable.

Descripción técnica concisa

TDD invierte el orden tradicional. En lugar de escribir código primero y agregar tests después, el desarrollador comienza con un test que falla. Este test describe el comportamiento deseado. Luego se escribe la menor cantidad posible de código para que el test pase. En el último paso se limpia el código sin romper los tests.

El ciclo Red-Green-Refactor

Red

Escribe un test para una función aún no implementada. Ejecuta el test. Debe fallar, de lo contrario el test no es significativo.

Green

Escribe el código mínimo necesario para que el test pase. La elegancia no importa en este paso; el objetivo es un test en verde.

Refactor

Limpia el código, elimina duplicados, mejora nombres y estructura. Todos los tests deben seguir en verde.

Mejores prácticas

  • Pasos pequeños: cada ciclo debería durar solo unos minutos.
  • Enfoque en el comportamiento: los tests describen qué debe hacer el software, no cómo lo hace internamente.
  • Sin código innecesario: escribe solo código que satisfaga un test.
  • No omitas refactor: el tercer paso es esencial para Clean Code.
  • Tests legibles: los tests documentan la intención del código.

Ejemplo práctico: cálculo de descuentos con TDD

import unittest
from app.pricing import calculate_discount

class TestDiscount(unittest.TestCase):
    def test_no_discount_below_threshold(self):
        self.assertEqual(calculate_discount(50), 0)

    def test_discount_for_threshold(self):
        self.assertEqual(calculate_discount(100), 10)

    def test_higher_discount_for_large_amount(self):
        self.assertEqual(calculate_discount(200), 20)

if __name__ == '__main__':
    unittest.main()
def calculate_discount(amount):
    if amount >= 200:
        return 20
    if amount >= 100:
        return 10
    return 0

Ventajas e inconvenientes

Ventajas

  • Requisitos más claros: los tests obligan a definir el comportamiento deseado.
  • Retroalimentación rápida: los errores se detectan de inmediato.
  • Mejor calidad del código: TDD fomenta funciones pequeñas y enfocadas.
  • Seguridad al refactorizar: los tests protegen contra regresiones.
  • Documentación viva: los tests muestran cómo debe usarse el software.

Inconvenientes

  • Curva de aprendizaje: TDD requiere práctica y disciplina.
  • Inversión inicial: el primer paso consume más tiempo que la programación convencional.
  • No es adecuado para todo: los spikes, prototipos o el desarrollo exploratorio se benefician menos.
  • Tests deficientes: los tests mal escritos conducen a un diseño deficiente.

Puntos clave para examen

  • Definición y objetivo de TDD.
  • Las tres fases: Red, Green, Refactor.
  • Diferencia entre TDD y testing convencional.
  • Ventajas y limitaciones de TDD.
  • Importancia de los pasos pequeños y el refactoring.

Preguntas típicas de examen (con respuesta breve)

  1. ¿Qué es TDD? Una práctica de desarrollo donde los tests se escriben antes del código de producción.

  2. ¿Cuáles son las tres fases del ciclo TDD? Red, Green, Refactor.

  3. ¿Qué ocurre en la fase Red? Se escribe un test que falla porque la función aún no existe.

  4. ¿Cuál es el objetivo de la fase Green? El código mínimo que hace pasar el test.

  5. ¿Cuál es una ventaja de TDD? Retroalimentación rápida y mejor cobertura de tests mediante pasos pequeños y enfocados.

Fuentes principales

  1. https://www.agilealliance.org/glossary/tdd/
  2. https://martinfowler.com/bliki/TestDrivenDevelopment.html
  3. https://en.wikipedia.org/wiki/Test-driven_development

Preguntas frecuentes

¿Qué significa Red-Green-Refactor?

Red representa un test que falla, Green el código mínimo que lo hace pasar, y Refactor la limpieza sin cambios en el comportamiento.

¿En TDD se debe probar cada línea de código?

No. TDD pretende definir el comportamiento mediante tests, no cubrir ciegamente cada línea. La calidad de los tests importa más que la cantidad.

¿TDD es solo para Unit Tests?

Tradicionalmente TDD comienza con Unit Tests, pero también se puede extender a tests de integración o tests de aceptación, por ejemplo mediante ATDD.

¿Qué es ATDD?

Acceptance Test Driven Development extiende TDD a tests de aceptación. Los tests se escriben desde la perspectiva del usuario o cliente antes de la implementación.

¿Cuánto tiempo debe durar un ciclo TDD?

Un ciclo ideal dura solo unos minutos. Los pasos pequeños permiten retroalimentación rápida y refactoring simple.

¿Qué pasa si omito el paso Refactor?

El código permanece improvisado y se vuelve más difícil de mantener con el tiempo. El refactoring es el paso que genera Clean Code y calidad sostenible.

¿Se puede introducir TDD en proyectos existentes?

Sí, pero a menudo requiere refactoring para hacer el código existente testeable. Las nuevas funciones y corrección de bugs son buenos puntos de partida.

¿TDD es más lento que la programación convencional?

Al principio TDD puede parecer más lento. A largo plazo, sin embargo, reduce los costos de errores y acelera el refactoring y las extensiones.

¿Qué es un anti-patrón de TDD?

Un anti-patrón común es escribir tests después de la implementación. También son problemáticos los mocks demasiado detallados o tests muy grandes por ciclo.

¿Cómo fomenta TDD Clean Code?

TDD fuerza código testeable, lo que generalmente resulta en código más modular, desacoplado y con mejor nomenclatura.

¿Cuál es la diferencia entre TDD y BDD?

TDD se enfoca en tests técnicos para el desarrollador. BDD traduce requisitos en ejemplos usando lenguaje de negocio para acercar desarrolladores y stakeholders.

¿Qué lenguajes de programación son adecuados para TDD?

TDD es agnóstico al lenguaje. Es especialmente popular en Java, Python, JavaScript, C# y Ruby porque tienen frameworks de testing robustos.

¿Qué debo probar cuando empiezo desde cero?

Comienza con el comportamiento más simple y central. Por ejemplo, el caso estándar o un caso de error claro, antes de cubrir casos límite complejos.

¿Cómo manejo las dependencias externas en TDD?

Las dependencias externas se reemplazan con Test Doubles como Mocks, Stubs o Fakes, de modo que el Unit Test permanece aislado y rápido.

¿Cuál es una razón común para el fracaso de TDD?

Pasos demasiado grandes, requisitos poco claros y omitir el paso de refactoring frecuentemente causan que TDD resulte frustrante y no sostenible.

Continúa en la ruta de aprendizaje de Software Testing

El siguiente artículo en la ruta de aprendizaje de Software Testing trata sobre Behavior Driven Development, es decir, cómo BDD mejora la comunicación entre desarrolladores y stakeholders.

Volver al blog
Share:

Nächster Artikel in Calidad de Software

Weiterlesen
Testpyramide: Unit, Integration y E2E Tests

Entradas relacionadas