---
title: "Desarrollo guiado por pruebas"
type: "architectural-pattern"
slug: "test-driven-development"
url: "http://localhost:3000/es/architectural-patterns/test-driven-development.md"
also_known_as: "TDD, Rojo-Verde-Refactorizar"
description: "Una disciplina de desarrollo en la que escribes una prueba que falla antes que el código que la hace pasar y, a continuación, refactorizas, dejando que las pruebas guíen el diseño en ciclos cortos y ajustados."
languages: ["python"]
---
# Desarrollo guiado por pruebas

_Also known as: TDD, Rojo-Verde-Refactorizar_

> Una disciplina de desarrollo en la que escribes una prueba que falla antes que el código que la hace pasar y, a continuación, refactorizas, dejando que las pruebas guíen el diseño en ciclos cortos y ajustados.

## Intent

Guiar el diseño y verificar la corrección del código escribiendo una prueba que falle para cada pequeña porción de comportamiento _antes_ de escribir el código que la satisface, y mejorando después el diseño mientras las pruebas te mantienen a salvo.

## Problem

El código escrito sin pruebas es arriesgado de cambiar: no hay una forma rápida de saber si una modificación rompió algo. Las pruebas escritas _a posteriori_ tienden a ser superficiales, moldeadas para encajar con un código que quizá ya sea difícil de probar, y rara vez influyen en el diseño.

Sin una función forzante, los diseños también tienden a enredarse y a volverse difíciles de ejercitar de forma aislada.

## Solution

Trabaja en un ciclo corto **Rojo-Verde-Refactorizar**:

1. **Rojo**: escribe una pequeña prueba para el siguiente fragmento de comportamiento y mírala fallar.
2. **Verde**: escribe el código más simple que hace pasar la prueba, aunque sea feo.
3. **Refactorizar**: limpia el código (y las pruebas) ahora que están en verde, con la suite protegiéndote frente a regresiones.

Repite en bucles de pocos minutos. Como las pruebas van primero, el código es testeable por construcción y la suite documenta el comportamiento previsto.

## Structure

* **El ciclo**: Rojo → Verde → Refactorizar, repetido de forma continua.
* **Lista de pruebas**: la lista en curso de comportamientos que aún faltan por cubrir.
* **Arrange–Act–Assert** (Preparar–Actuar–Afirmar): la forma de una prueba unitaria enfocada.
* **Unidad bajo prueba**: la pequeña porción de comportamiento que fija cada prueba.

## Applicability

* Úsalo para código con **lógica y ramificación** reales, y para código de larga vida que cambiará a menudo.
* Especialmente valioso allí donde importan un ciclo de retroalimentación rápido y la seguridad frente a regresiones.
* **Menos adecuado** para experimentos desechables (spikes) o trabajo de UI exploratorio donde el diseño aún está en flujo.

## How to Implement

1. Elige el siguiente comportamiento pequeño de tu lista de pruebas.
2. Escribe una prueba que lo afirme y ejecuta la suite para verla fallar (rojo).
3. Escribe el código mínimo necesario para que pase; ejecuta la suite (verde).
4. Refactoriza el código de producción y de pruebas manteniendo la suite en verde.
5. Repite, añadiendo comportamientos a la lista a medida que los descubras.

## Pros

* Alta cobertura de pruebas como subproducto, no como ocurrencia tardía.
* La retroalimentación rápida detecta regresiones en cuestión de segundos.
* Fomenta diseños desacoplados y testeables.
* La suite actúa como documentación viva y ejecutable.

## Cons

* Ritmo inicial más lento y una curva de aprendizaje real.
* Puede sobreenfatizar las unidades aisladas y pasar por alto huecos de integración.
* Las pruebas también son código: hay que mantenerlas y refactorizarlas.
* No sustituye a las pruebas exploratorias, de integración o de extremo a extremo.
## Relations

**Related patterns**

- [Spec-Driven Development](/es/architectural-patterns/spec-driven-development.md)

## Code Examples

### python

```python
# Rojo: escribe primero la prueba que falla.
def test_slugify_lowercases_and_hyphenates():
    assert slugify('Hello World') == 'hello-world'

# Verde: el código más simple que pasa.
def slugify(text: str) -> str:
    return text.lower().replace(' ', '-')

# Refactoriza después (p. ej., elimina la puntuación) con la prueba como red de seguridad.
```

