TDD: Test Driven Development ¿para qué sirve?

¿Cuántos bugs has arreglado a lo largo de tu vida como programador? Seguramente muchos, y seguramente algunos de ellos fueron sencillos de arreglar una vez que te diste cuenta de que estaban ahí, pues bien, si no quieres que esto te siga pasando ¡Empieza ya a aplicar TDD!

 

¿Qué es TDD (Test Driven Development)?

La idea es muy simple, que todo el desarrollo que vayas a hacer, tenga primero una prueba automatizada que confirme que ese desarrollo (aún) no funciona.

Por ejemplo, tenemos un stock de productos y queremos saber cuánto dinero tenemos:

Como podéis ver, tenemos una array de productos, un objeto que no devuelve nada y unas funciones extrañas con describes e its y al final una función que permite que jasmine funcione en jsfiddle. Un momento, ¿qué es jasmine? Es una herramienta de entre otras muchas que nos permite testar nuestro código, en este caso JavaScript. Nos proporciona funciones como las describe e it permitiéndonos que el código de testeo sea mucho más legible.

Volviendo al código si haces click en la pestaña Result verás que hay un test fallando, ¡perfecto, como tiene que ser! El test nos indica que el método total no esta definido, así que según el sistema de desarollo propuesto en TDD nuestro siguiente paso es hacer pasar el test con el mínimo de código posible:

¡Bien, esta en verde! Te preguntarás por que estoy tan contento si no he conseguido absolutamente nada... Bueno, no estoy de acuerdo, seguro que ahora sabes cuál va a ser el siguiente paso, ¿no notas como si el desarrollo ya no consistiera en divagar o especular sobre qué código vas a tener que escribir para resolver el problema? Vamos a seguir y seguro que terminas de convencerte.

Ahora necesitamos un test que falle sobre el resultado que debería devolver la función total:

¿Y a continuación, cuál es el siguiente paso? ¡Implementar la función total, obviamente!

Listo, a por la siguiente funcionalidad. Te invito a añadir una funcionalidad que liste todos los productos separados por comas siguiendo TDD.

Ventajas

  • Escribes únicamente el código justo y necesario para pasar las pruebas.
  • Escribes código más robusto, para que el código sea testable tiene que ser sencillo, terminas teniendo pequeñas funciones haciendo cosas muy concretas.
  • Tienes una guía de cómo llevar a cabo tu desarollo.
  • Aumenta la confianza en tu código.
  • Reduce las veces que vas a usar el debugger.
  • Esta automatizado, no vas a tener que comprobar manualmente esa funcionalidad tan importante antes de cada deploy.
  • Los tests sirven de documentación del código que testea.

Inconvenientes

  • Escribes más código, ya que necesitas el código que testea tu código de producción.
  • Más código implica más tiempo al principio que se convierte en menos tiempo de arreglar bugs en un futuro.
  • Si trabajas en equipo, todo el mundo tiene que adoptar el TDD para que sea realmente útil.

Experiencia Personal

Hace medio año que me leí Test Driven Development By Example de Kent Beck y que adopté TDD y la verdad es que he ganado confianza en el código que desarrollo. Lo encuentro una técnica perfecta para desarrollar algoritmos que modifican estructuras de datos. A la hora de hacer un deploy de una nueva versión de mis desarrollos, compruebo que todos los test pasan y si es así, hago el deploy. Es cierto me han seguido saliendo bugs, pero el hecho de tener tests indica que ese bug es simplemente un caso que no controlé en su momento y el trabajo de arreglar ese bug es tan simple como añadir un test más. Por otra parte en cuanto a tests de integración me ha llevado mucho tiempo configurar un entorno y creo que no me ha salido a cuenta, he hecho medio desarollo con tests de integración y medio sin, y no estoy viendo que aparezcan más bugs en las partes que no tienen tests de integración.

 

¡Saludos!

 

¿Te ha gustado el artículo? ¿Quieres que te avise de mis próximas publicaciones?

¿Quieres seguir aprendiendo?

¿Qué es React?

Este es el primero de una serie de tres posts en los que iré explicando los puntos fuertes y no tan fuertes de las tres herramientas más usadas a día de hoy para construir frontends (React, Angular, Vue). Hoy es el turno de React...

Seguir leyendo