En el acelerado mundo del desarrollo de software, donde la innovación y la entrega rápida son la norma, a menudo se pasa por alto un aspecto fundamental: la calidad del producto final.
![talon de aquiles2 1](https://blog.continuumhq.com/hs-fs/hubfs/talon%20de%20aquiles2%201.png?width=1210&height=762&name=talon%20de%20aquiles2%201.png)
Como arquitecto y programador con algunos años ya liderando equipos, he sido testigo de cómo la falta de énfasis en las pruebas puede afectar drásticamente la integridad y durabilidad de un sistema.
Después de todo, como usuarios de otros sistemas, nosotros mismos comprendemos lo frustrante que puede ser interactuar con software defectuoso.
En este contexto, desde una perspectiva técnica, en este artículo te invito a explorar los problemas que surgen cuando no escribimos pruebas y algunas ideas de cómo hacer que el proceso de escribirlas sea incluso… un proceso satisfactorio.
Problemas de diseño: El error de dejar las pruebas para el final
¿Alguna vez has escrito pruebas después de implementar el código? Seguro que sí, la mayoría lo hemos hecho. Es el camino más común, pero no el más divertido, ¿verdad? Puede ser tedioso porque ya sabes que el código funciona, así que escribir pruebas puede parecer innecesario o hasta una pérdida de tiempo.
Inevitablemente, en algún momento todos nos topamos con una prueba difícil de escribir. ¿Por qué? Porque no diseñamos el código para ser comprobable; nos centramos en que funcione. Para probar ese código, tendríamos que rediseñarlo, lo que llevaría mucho tiempo y podría romper algo más en el proceso. En consecuencia (por lo general) la prueba se abandona, comprometiendo la integridad de la suite de pruebas en el camino.
Probablemente, has estado en esa situación más de una vez. Si has dejado código sin probar, es muy probable que otros miembros de tu equipo también lo hayan hecho. Es común que algunos programadores declaren que han terminado una tarea o parte del proyecto después de implementar código sin pruebas, subestimando la importancia de estas en el proceso de desarrollo.
Si la suite de pruebas pasa, deberías sentirte seguro para recomendar el despliegue del sistema… pero, si la suite no te da esa confianza, ¿de qué sirve?
![all unit test pass (a la fuerza)](https://blog.continuumhq.com/hs-fs/hubfs/test%20units.png?width=640&height=461&name=test%20units.png)
Miedo al cambio: El enemigo invisible de la evolución del código
Comenzar un nuevo proyecto de software es emocionante. Las ideas fluyen y las funcionalidades se agregan con rapidez. Todo parece funcionar bien, y estamos ansiosos por compartir nuestro trabajo con el mundo. Sin embargo, lo que se suele olvidar en medio de este proceso creativo es el mantenimiento a largo plazo.
A medida que el tiempo avanza y se van añadiendo cambios, inevitablemente comienzan a surgir problemas.
Lo que una vez fue un código limpio y ordenado, poco a poco se convierte en un conjunto de parches y soluciones temporales, dificultando aún más cualquier intento futuro de mejorarlo. El proceso de desarrollo se ralentiza y los errores se vuelven más frecuentes. O incluso, algo que puede ser más preocupante aún...estos errores pueden pasar desapercibidos, provocando comportamientos inesperados.
Cada vez que navegamos por el código, a menudo nos encontramos con partes que podrían ser mejoradas. Sin embargo, el miedo a romper lo que ya funciona nos detiene. Nadie quiere ser responsable de introducir nuevos errores en el código, sin embargo es obligatorio hacer cambios, tendemos a hacerlo de la manera más segura para el programador, no la mejor para el sistema. Como resultado, el diseño y el código se degradan, disminuyendo la productividad del equipo casi por completo.
Pero, ¿qué pasaría si tuvieras una suite de pruebas en la que pudieras confiar para recomendar el despliegue cada vez que se pasa? ¿Cuánto miedo tendrías de aplicar cambios? Por ejemplo, si cada vez que realizas un cambio en el código, tuvieras la capacidad de ejecutar una suite de pruebas que verifique automáticamente si has roto algo. O que con la suite de pruebas puedas limpiar el código de forma segura y detectar cualquier efecto secundario no deseado producto de algún cambio en el código.
El miedo a romper el código ya no sería una preocupación.
Las pruebas también sirven como una documentación viva del sistema. Al revisar las pruebas, los programadores pueden comprender rápidamente cómo se espera que funcione cada parte del código y cómo interactúan entre sí.
![we don't write tests meme](https://blog.continuumhq.com/hs-fs/hubfs/Untitled%20(7).png?width=2000&height=1294&name=Untitled%20(7).png)
TDD: La solución a los males del código y el miedo al cambio
Una solución a los problemas mencionados anteriormente es adoptar el desarrollo guiado por pruebas (TDD). En lugar de escribir pruebas después de la implementación del código, TDD propone un enfoque diferente: escribir las pruebas antes de escribir el código de producción.
El ciclo de desarrollo en TDD sigue un patrón simple pero poderoso: escribir una prueba que falle, escribir la cantidad mínima de código para que la prueba pase y luego refactorizar ese código para mejorar su diseño sin cambiar su comportamiento.
Este enfoque tiene varios beneficios. En primer lugar, nos obliga a considerar la prueba desde el principio, lo que a menudo conduce a un diseño de código más desacoplado y comprobable. Al escribir pruebas antes de la implementación, se crea una especificación clara y concreta de lo que se espera que haga el código, lo que ayuda a mantener el enfoque en los requisitos funcionales del sistema.
Las pruebas proporcionan una red de seguridad para el desarrollo continuo. A medida que se realizan cambios en el código, las pruebas automatizadas pueden ejecutarse rápidamente para validar que no se han introducido errores.
Por último, cada prueba se convierte en un desafío, lo cual resulta motivante ver pasar después de escribir el código de producción o refactorizarlo, manteniendo la satisfacción de lograrlo sin que se rompa algo.
![meme: happiness when your code work without any errors](https://blog.continuumhq.com/hs-fs/hubfs/Untitled%20(8).png?width=960&height=670&name=Untitled%20(8).png)
Al adoptar prácticas como TDD, podemos mitigar los problemas de diseño, superar el miedo al cambio y mejorar la calidad del código de manera constante. Si algo se rompe, lo sabremos de inmediato. Esta capacidad nos permite mantener nuestro código saludable y resistente al paso del tiempo.
![Medusa_icon](https://blog.continuumhq.com/hs-fs/hubfs/Medusa_icon.png?width=32&height=32&name=Medusa_icon.png)