---
title: "¿Qué es TDD (Test-Driven Development)?"
canonical: https://wavect.io/es/glossary/tdd/
language: es
description: "Escribe el test primero. Mira cómo falla. Escribe el código que lo hace pasar. Refactoriza. Repite."
image: "https://wavect.io/img/general/bak/open_graph_preview.jpg"
---

METODOLOGÍA

# TDD

Test-Driven Development

Escribe el test primero. Mira cómo falla. Escribe el código que lo hace pasar. Refactoriza. Repite.

Última revisión: 2026-05-24 por [Kevin Riedl](/es/team/kevin-riedl/) [wiki ↗](https://www.wikidata.org/wiki/Q139796365)

Test-Driven Development es una disciplina, no una metodología. El loop es: rojo (escribir un test que falla), verde (escribir el código más simple que pase), refactor (limpiar sin romper el test). Hecho al pie de la letra, produce código con cobertura de tests muy alta y una función de fuerza contra el over-engineering. La disciplina solo paga cuando esos tests corren en cada cambio, por eso TDD y [CI/CD](/es/glossary/ci-cd/) son hermanos, no preocupaciones separadas.

Por qué la mayoría de los equipos dicen que hacen TDD pero no lo hacen: escribir el test primero se siente más lento en el momento. El payoff (seguridad para refactorizar, cobertura de regresión, presión de diseño hacia unidades pequeñas) llega meses después. Para entonces el equipo dejó de escribir los tests primero y se convenció de que nunca marcó la diferencia.

Ejemplo de dónde TDD se gana su coste frente a dónde es teatro: un módulo de conciliación de pagos tiene casos límite peliagudos (reembolsos parciales, redondeo de divisa, reintentos). Escribir el test que falla primero te obliga a declarar el comportamiento esperado antes de que exista el código, y la suite atrapa la regresión seis meses después cuando alguien «simplifica» el redondeo. Eso es TDD pagándose solo. Ahora contrasta un script de importación de datos desechable que borrarás en dos semanas: escribir tests primero ahí es puro overhead. La regla honesta es hacer TDD del código pesado en lógica y caro de equivocar y no del resto.

El error más común es tratar la cobertura como un objetivo. Persigue el 90 % y el equipo escribe tests para getters y setters para llegar al número mientras se salta los tests de integración donde viven los bugs reales. La cobertura es un diagnóstico útil y un objetivo terrible; es una métrica que se manipula. Wavect usa TDD donde paga: tests de integración para todo lo que tenga forma de dinero, tests de contrato para todo lo orientado al cliente, tests de aceptación estilo [BDD](/es/glossary/bdd/) donde producto necesita leerlos, tests unitarios para lógica no trivial. Probamos bien las partes difíciles, no todas las partes por igual, y lo tratamos como una práctica dentro de un loop [agile](/es/glossary/agile/) sano en vez de una casilla que marcar.

// FAQ

## Preguntas frecuentes

### ¿Cuál es la falla más común al «hacer TDD»?

Escribir el test después del código y llamarlo TDD. El test pasa porque el código ya existe; no hubo rojo, no hubo presión de diseño. Es cobertura, no test-driven. Si el equipo no recuerda la última vez que un test falló al escribirlo, no están haciendo TDD.

### ¿100 % de cobertura es el objetivo?

No. Es una métrica que se manipula. Cobertura alta con asserts triviales es peor que cobertura media con asserts que de verdad detectan regresiones. Lo que mide es si el código se ejecuta durante los tests, no si el comportamiento se está verificando. Mide mutation testing si quieres una señal honesta.

### ¿Para qué tipo de código TDD claramente NO conviene?

Prototipos exploratorios y código de UI donde el comportamiento se descubre mientras se prueba visualmente. Forzar TDD ahí ralentiza el aprendizaje. Pasa a TDD cuando el comportamiento se estabiliza y refactorizar sin red empieza a doler.

Términos relacionados

- [BDD](/es/glossary/bdd/)
- [Agile](/es/glossary/agile/)
- [CI/CD](/es/glossary/ci-cd/)
- [SDLC](/es/glossary/sdlc/)

Servicios relacionados

- [Desarrollo de software](/es/services/software-development/)

Casos de estudio relacionados

- [Polity](/es/case-studies/polity/)

Guías relacionadas

- [El proceso de desarrollo de software por semanas](/es/software-development-guide/software-development-process/)

Hablemos

## Structured Data

```json
{
  "@context": "https://schema.org",
  "@graph": [
    {
      "@id": "https://wavect.io/#organization",
      "@type": [
        "Organization",
        "ProfessionalService",
        "LocalBusiness"
      ],
      "employee": [
        {
          "@id": "https://wavect.io/team/kevin-riedl/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Kevin Riedl",
          "url": "https://wavect.io/team/kevin-riedl/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        },
        {
          "@id": "https://wavect.io/team/christof-jori/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Christof Jori",
          "url": "https://wavect.io/team/christof-jori/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        }
      ],
      "founder": [
        {
          "@id": "https://wavect.io/team/kevin-riedl/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Kevin Riedl",
          "url": "https://wavect.io/team/kevin-riedl/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        },
        {
          "@id": "https://wavect.io/team/christof-jori/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Christof Jori",
          "url": "https://wavect.io/team/christof-jori/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        }
      ],
      "legalRepresentative": [
        {
          "@id": "https://wavect.io/team/kevin-riedl/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Kevin Riedl",
          "url": "https://wavect.io/team/kevin-riedl/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        },
        {
          "@id": "https://wavect.io/team/christof-jori/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Christof Jori",
          "url": "https://wavect.io/team/christof-jori/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        }
      ],
      "name": "Wavect GmbH",
      "subjectOf": {
        "@id": "https://wavect.io/verified-claims.json#dataset",
        "@type": "Dataset",
        "creator": {
          "@id": "https://wavect.io/#organization",
          "@type": [
            "Organization",
            "ProfessionalService",
            "LocalBusiness"
          ]
        },
        "description": "A machine-readable registry of quantitative and qualitative claims published by Wavect, with review dates, localized page appearances and public third-party citations where available.",
        "inLanguage": "en",
        "isAccessibleForFree": true,
        "license": "https://creativecommons.org/licenses/by/4.0/",
        "name": "Wavect verified publication claims",
        "url": "https://wavect.io/verified-claims.json"
      },
      "url": "https://wavect.io/"
    },
    {
      "@id": "https://wavect.io/team/kevin-riedl/#person",
      "@type": "Person",
      "jobTitle": "Managing Director",
      "name": "Kevin Riedl",
      "sameAs": [
        "https://www.wikidata.org/wiki/Q139796365",
        "https://www.linkedin.com/in/wsdt",
        "https://github.com/wsdt"
      ],
      "url": "https://wavect.io/team/kevin-riedl/",
      "worksFor": {
        "@id": "https://wavect.io/#organization",
        "@type": [
          "Organization",
          "ProfessionalService",
          "LocalBusiness"
        ]
      }
    },
    {
      "@id": "https://wavect.io/team/christof-jori/#person",
      "@type": "Person",
      "jobTitle": "Managing Director",
      "name": "Christof Jori",
      "sameAs": [
        "https://www.wikidata.org/wiki/Q139796367",
        "https://www.linkedin.com/in/jocr77/",
        "https://github.com/jo-chris"
      ],
      "url": "https://wavect.io/team/christof-jori/",
      "worksFor": {
        "@id": "https://wavect.io/#organization",
        "@type": [
          "Organization",
          "ProfessionalService",
          "LocalBusiness"
        ]
      }
    },
    {
      "@id": "https://wavect.io/#website",
      "@type": "WebSite",
      "inLanguage": [
        "en",
        "de",
        "es",
        "zh"
      ],
      "name": "Wavect",
      "potentialAction": {
        "@type": "SearchAction",
        "query-input": "required name=search_term_string",
        "target": {
          "@type": "EntryPoint",
          "urlTemplate": "https://wavect.io/search/?q={search_term_string}"
        }
      },
      "publisher": {
        "@id": "https://wavect.io/#organization",
        "@type": [
          "Organization",
          "ProfessionalService",
          "LocalBusiness"
        ]
      },
      "url": "https://wavect.io/"
    }
  ]
}
```

```json
{
  "@context": "https://schema.org",
  "@graph": [
    {
      "@id": "https://wavect.io/es/glossary/tdd/#term",
      "@type": "DefinedTerm",
      "alternateName": [],
      "description": "Escribe el test primero. Mira cómo falla. Escribe el código que lo hace pasar. Refactoriza. Repite.",
      "inDefinedTermSet": "https://wavect.io/es/glossary/#termset",
      "name": "TDD",
      "termCode": "tdd",
      "url": "https://wavect.io/es/glossary/tdd/"
    },
    {
      "@id": "https://wavect.io/es/glossary/tdd/#webpage",
      "@type": "WebPage",
      "about": {
        "@id": "https://wavect.io/#organization",
        "@type": [
          "Organization",
          "ProfessionalService",
          "LocalBusiness"
        ]
      },
      "author": {
        "@id": "https://wavect.io/team/kevin-riedl/#person",
        "@type": "Person",
        "name": "Kevin Riedl",
        "url": "https://wavect.io/team/kevin-riedl/"
      },
      "dateModified": "2026-05-24",
      "description": "Escribe el test primero. Mira cómo falla. Escribe el código que lo hace pasar. Refactoriza. Repite.",
      "headline": "TDD",
      "inLanguage": "es",
      "isPartOf": {
        "@id": "https://wavect.io/#website",
        "@type": "WebSite"
      },
      "lastReviewed": "2026-05-24",
      "mainEntity": {
        "@id": "https://wavect.io/es/glossary/tdd/#term"
      },
      "mentions": [
        {
          "@id": "https://wavect.io/#organization",
          "@type": [
            "Organization",
            "ProfessionalService",
            "LocalBusiness"
          ]
        }
      ],
      "name": "TDD",
      "reviewedBy": {
        "@id": "https://wavect.io/team/christof-jori/#person",
        "@type": "Person",
        "name": "Christof Jori",
        "url": "https://wavect.io/team/christof-jori/"
      },
      "speakable": {
        "@type": "SpeakableSpecification",
        "cssSelector": [
          ".gls-single__h1",
          ".gls-single__tldr"
        ]
      },
      "url": "https://wavect.io/es/glossary/tdd/"
    },
    {
      "@type": "BreadcrumbList",
      "itemListElement": [
        {
          "@type": "ListItem",
          "item": "https://wavect.io/es/",
          "name": "Inicio",
          "position": 1
        },
        {
          "@type": "ListItem",
          "item": "https://wavect.io/es/glossary/",
          "name": "Glosario de tech, producto e ingeniería",
          "position": 2
        },
        {
          "@type": "ListItem",
          "item": "https://wavect.io/es/glossary/tdd/",
          "name": "TDD",
          "position": 3
        }
      ]
    }
  ]
}
```

```json
{
  "@context": "https://schema.org",
  "@type": "FAQPage",
  "mainEntity": [
    {
      "@type": "Question",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Escribir el test después del código y llamarlo TDD. El test pasa porque el código ya existe; no hubo rojo, no hubo presión de diseño. Es cobertura, no test-driven. Si el equipo no recuerda la última vez que un test falló al escribirlo, no están haciendo TDD."
      },
      "name": "¿Cuál es la falla más común al «hacer TDD»?"
    },
    {
      "@type": "Question",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "No. Es una métrica que se manipula. Cobertura alta con asserts triviales es peor que cobertura media con asserts que de verdad detectan regresiones. Lo que mide es si el código se ejecuta durante los tests, no si el comportamiento se está verificando. Mide mutation testing si quieres una señal honesta."
      },
      "name": "¿100 % de cobertura es el objetivo?"
    },
    {
      "@type": "Question",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "Prototipos exploratorios y código de UI donde el comportamiento se descubre mientras se prueba visualmente. Forzar TDD ahí ralentiza el aprendizaje. Pasa a TDD cuando el comportamiento se estabiliza y refactorizar sin red empieza a doler."
      },
      "name": "¿Para qué tipo de código TDD claramente NO conviene?"
    }
  ],
  "speakable": {
    "@type": "SpeakableSpecification",
    "cssSelector": [
      ".faq-question",
      ".faq-answer"
    ]
  }
}
```
