test driven development testing tdd testing-strategies test-first

testing - driven - ¿Hay alguna diferencia entre TDD y Test First Development(o Test First Programming)?



behavior driven development (7)

Ambas ideas suenan muy similares a mí, pero puede haber diferencias sutiles o exactamente lo mismo, explicadas de diferentes maneras. ¿Cuál es la relación entre TDD y Test First Development / Programming?


Históricamente correcto: la programación de prueba primero y el desarrollo controlado por prueba significan lo mismo con un nombre mejorado

En el contexto de XP (Extreme Programming), que es el proceso de desarrollo de software que popularizó la Programación Test-First y el Desarrollo impulsado por pruebas, la Programación Test-First pasó a llamarse Desarrollo basado en pruebas y luego Diseño basado en pruebas tras la constatación de que primero, escribir pruebas tiene un efecto tremendamente positivo en la arquitectura del software y el diseño de un sistema de software.

Esta influencia en la arquitectura y el diseño es una consecuencia de sinónimos más o menos sorprendentes:

  • Testable
  • Desacoplado
  • Reutilizable
  • Independientemente desplegable
  • Independientemente Desarrollable
  • Independientemente razonable

Las entidades de software solo pueden reutilizarse, probarse, implementarse de forma independiente, desarrollarse independientemente o razonarse fácilmente por separado si están desacopladas. Escribir pruebas antes de la implementación real es un método casi a prueba de balas para garantizar el desacoplamiento continuo.

Esta influencia en el diseño y la arquitectura del software se volvió tan importante además de los otros efectos positivos que los creadores encontraron que valía la pena cambiar su nombre de Programación de Prueba Primero a Desarrollo Basado en Prueba.

El nombre Test-Driven Development también ayuda a comercializar mejor el método en términos de aceptación y comprensión debido a que el nombre Test-Driven Development enfatiza mejor los aspectos holísticos del método que la Programación Test-First.

No es históricamente correcto pero útil

Aunque históricamente no es correcto, la siguiente distinción me resulta muy útil:

Programación de prueba primero ...

... es cualquier método en el que las pruebas para el código bajo prueba se escriben antes del código bajo prueba.

Desarrollo basado en pruebas ...

... es un subconjunto específico de la Programación de Prueba Primero que sigue las 3 Leyes del Desarrollo Impulsado por Pruebas como lo describe Robert C. Martin:

  1. No puede escribir ningún código de producción hasta que haya escrito por primera vez una prueba de unidad que falla.
  2. No puede escribir más de una prueba unitaria que es suficiente para fallar, y no está fallando la compilación.
  3. No puede escribir más código de producción de lo que es suficiente para pasar la prueba de unidad que falla actualmente. - Robert C. Martin, Las tres leyes del desarrollo impulsado por pruebas

Otros renombrados interesantes en Extreme Programming

  • Integración continua -> Entrega continua -> Despliegue continuo; Estrictamente hablando significan cosas diferentes, sin embargo, en el espíritu de XP, significó el Despliegue continuo desde el principio, y cuando la gente se subió al carro, se dio cuenta de que la integración se tomaba demasiado literalmente y la gente se detenía antes de terminar.
  • Refactorización continua -> Mejora continua del diseño; Refactorizar no es un medio para un fin en sí mismo, sino que sigue un propósito más elevado.
  • 40 horas semana -> Ritmo Sostenible

Básicamente son nombres diferentes que describen lo mismo, bueno, de hecho, cinco nombres, ya que la última D puede significar Diseño y Desarrollo.

Test First fue el término utilizado originalmente, especialmente en el contexto de Extreme Programming, para el ciclo test-code-refactor. El nombre Test Driven Development se ha propuesto, y adoptado rápidamente, para recalcar el hecho de que TFD es, y siempre ha sido, una estrategia de diseño más que una estrategia de prueba.

Obviamente, hoy en día, algunas personas tienen diferentes connotaciones para esos dos términos, pero esa no era la intención detrás de su existencia, y no confiaría en que sea de conocimiento común (porque no lo es). De hecho, prefiero ver el término TFD como obsoleto.


Hay muchos términos similares, como programación de prueba inicial, desarrollo de prueba inicial, desarrollo basado en prueba o incluso diseño basado en prueba. Es importante aclarar algunos puntos:

1. Probar primero la programación (TFP)

El término programación de prueba primero es una mejor práctica de programación. Fue reintroducido (si no acuñado) por Kent Beck en su libro "Extreme Programming Explained": "Escribe las pruebas unitarias antes de programar y mantén todas las pruebas ejecutándose en todo momento". Por lo tanto, cuando se habla de programación de prueba, estamos hablando de escribir pruebas unitarias automatizadas por el mismo desarrollador que va a escribir el código para satisfacer esas pruebas. Las pruebas unitarias se acumulan y crean un conjunto de pruebas de regresión automatizadas que se pueden ejecutar periódicamente.

2. Prueba Driven Development (TDD)

Test-driven development (TDD) es el nombre de una metodología introducida por Kent Beck en su libro "Test Driven Development by Example". Es un proceso de desarrollo de software, no se trata solo de escribir pruebas antes del código. Todo el libro trata de explicarlo por patrones, flujos de trabajo, cultura, etc. Un aspecto importante de esto es el énfasis en la refactorización.

Algunas personas usan los términos desarrollo de prueba primero, diseño impulsado por prueba o programación basada en prueba y ... Una cosa es segura: la metodología bien establecida es el desarrollo basado en pruebas y la técnica de programación es la programación de prueba primero. El resto generalmente se refiere a la idea de escribir pruebas antes del código o referirse erróneamente al desarrollo basado en pruebas o la programación de prueba.


Hay una diferencia en términos de cuál es el factor determinante.

¿Tiene una vaga idea de cómo debería ser la clase (o sistema, esto puede suceder a diferentes escalas, por supuesto) y luego piensa en pruebas que le dan la forma real? Eso es TDD.

¿Sabes exactamente cuál debería ser la API pública de la clase y solo escribes las pruebas antes de la implementación? Es el primer desarrollo de prueba.

Mi estilo tiende a ser una mezcla de los dos. A veces es obvio cuál debería ser la API antes de escribir cualquier prueba; en otros casos, la capacidad de prueba realmente impulsa el diseño.

Para decirlo de otra manera, TDD comienza con "¿Qué preguntas quiero formular?" mientras que no TDD (ya sea prueba primero o no) comienza con "¿Qué respuesta quiero dar?"


Son exactamente lo mismo. Ambos exámenes de escritura de referencia primero, luego escribir el código que pasará la prueba


TDD (Desarrollo controlado por prueba) es el primer desarrollo / programación de prueba aunque he visto y escuchado que TDD solía significar la creación de pruebas persistentes y repetibles (incluso después del código), pero realmente implica que las pruebas se escriben antes del código que están probando.


TDD = TFD + Refactorización.

Cuando haces TFD, aplicas algunas refactorizaciones para hacer que el código sea más genérico y robusto.