TDD en Drupal: ¿Revolución o Retroceso?

TDD

El Desarrollo Dirigido por Pruebas, en inglés Test Driven Development (TDD) es una metodología de desarrollo de software que implica escribir pruebas antes de desarrollar el código funcional. Es especialmente útil en entornos de desarrollo de Drupal para garantizar que nuevas funcionalidades y correcciones no alteren funcionalidades existentes. Y últimamente se viene hablando bastante sobre este tema en la comunidad, así que yo también quería expresar mi opinión acerca del tema y exponer por qué creo que se está tratando mal. 

¿Cómo aplico TDD?

El flujo de trabajo de TDD en Drupal sigue un ciclo iterativo que asegura que el desarrollo se mantenga enfocado en cumplir con los requisitos establecidos, y que el producto final sea robusto y confiable. Por eso, lo primero que se debe tener claro son las etapas del proceso y los roles que intervienen en cada una:

1. Definición y Toma de Requisitos

Actores Principales: Analistas funcionales

Esta etapa se enfoca en capturar los requisitos funcionales, no funcionales y de negocio que guiarán el desarrollo del software. Los Analistas funcionales definen los requisitos del sistema, normalmente colaborando estrechamente  con el cliente, para asegurar que todas las necesidades y expectativas se comprendan claramente.

2. Creación de Pruebas

Actores Principales: Creadores de Pruebas (QA o Desarrolladores)

Con los requisitos definidos, los Creadores de Pruebas diseñan y escriben casos de prueba específicos que reflejan los criterios de aceptación de las funcionalidades descritas. Estas pruebas inicialmente fallarán, ya que el código necesario para pasar estas pruebas aún no se ha escrito, estableciendo un claro objetivo para el equipo de desarrollo.

3. Implementación del Código

Actores Principales: Desarrolladores

Los Desarrolladores toman los casos de prueba fallidos como guía para elaborar el código que satisface los requisitos establecidos. El objetivo es escribir código claro y eficiente que haga que las pruebas pasen correctamente.

4. Verificación y Validación de las Pruebas

Actores Principales: Verificadores de Pruebas / CI

Una vez implementado el código, los Verificadores de Pruebas o desde Integración continua (CI) se ejecutan todas las pruebas para asegurarse de que cumplen con lo esperado y que el código nuevo no introduce errores en funcionalidades existentes. Este paso confirma que el desarrollo satisface las demandas del proyecto y mantiene la integridad del sistema completo.

5. Revisión del Código

Actores Principales: Revisores de Código

Antes de que el código se integre al repositorio principal, los Revisores de Código, suelen ser desarrolladores senior o líderes técnicos, examinan el código en detalle. Verifican que este siga las mejores prácticas y los estándares de Drupal, asegurando su calidad y mantenibilidad a largo plazo. Esta revisión previene problemas durante la integración y despliegue en producción, garantizando una incorporación sin contratiempos.

Siguiendo este flujo se garantiza que todas las características del código sean revisadas meticulosamente antes de su lanzamiento, minimizando los riesgos asociados con defectos de software y mejorando la calidad general del producto.

TDD es genial, pero, ¿Me viene bien?

Integrar TDD en un equipo de desarrollo no es algo que se pueda hacer de un día para otro, especialmente en entornos complejos como los que se encuentran típicamente en proyectos de Drupal. Para que la adopción de TDD pueda, al menos, plantearse, el equipo debe primero asegurarse de que cuenta con una base sólida en diferentes aspectos. Para mí, principalmente hay una serie de requisitos previos que deben cumplirse:

  1. Comprensión de Pruebas Automatizadas: El equipo debe estar familiarizado con los conceptos básicos de pruebas automatizadas, incluyendo pruebas unitarias, de integración y funcionales.
  2. Integración Continua (CI): Implementar un sistema de CI es fundamental antes de adoptar TDD. Esto asegura que las pruebas se ejecuten automáticamente cada vez que se realicen cambios en el código, proporcionando retroalimentación inmediata.
  3. Refactorización de Código: La capacidad de refactorizar código de manera efectiva es imprescindible en TDD. El equipo debe ser competente en técnicas de refactorización para mejorar la estructura del código sin cambiar su comportamiento externo.
  4. Revisión de Código: Las revisiones de código deben ser obligatorias, permitiendo a los equipos compartir conocimientos y asegurar que el código cumpla con los estándares antes de ser fusionado.
  5. Pair programming: La programación en parejas no solo mejora la calidad del código, sino que también es una excelente manera de resolver problemas complejos y compartir conocimientos sobre TDD entre los miembros del equipo.
Cuándo Usar TDD
  • Proyectos con Requisitos Bien Definidos: TDD funciona mejor cuando los requisitos son claros y bien definidos. En escenarios donde se puede especificar con detalle qué debe hacer el sistema, TDD puede guiar eficazmente el desarrollo.
  • Proyectos que Requieren Alta Calidad de Código y Mantenibilidad: En proyectos donde la calidad del código es crítica, como en sistemas financieros o de salud, TDD ayuda a asegurar que el código cumpla con los más altos estándares de calidad y seguridad.
Cuándo No Usar TDD
  • Proyectos con Requisitos Cambiantes: En ambientes dinámicos donde los requisitos cambian frecuentemente, mantener las pruebas actualizadas puede consumir demasiados recursos y ralentizar el desarrollo.
  • Prototipos Rápidos: Para proyectos que requieren iteración rápida y la creación de prototipos, el tiempo extra necesario para escribir pruebas puede ser un obstáculo. En estos casos, es posible que se prefiera un enfoque más ágil y menos formalizado.

TDD es una metodología muy poderosa que puede llevar a una mejor calidad de código, una mayor satisfacción del cliente y al mismo tiempo una reducción significativa del coste de desarrollo al no generar regresiones. Sin embargo, no es siempre la estrategia adecuada para cada situación o equipo. Aunque el TDD tiene muchas ventajas, es importante evaluar las necesidades específicas del proyecto y las capacidades del equipo para determinar si es la metodología adecuada.

No quiero o no puedo usar TDD, ¿Estoy perdido?

El uso de TDD en proyectos de Drupal ha ganado una considerable popularidad por su enfoque en mejorar la calidad del código y reducir los errores desde las primeras etapas de desarrollo. Sin embargo, TDD no es la única metodología que puede llevar a éxito y bien estructurada. Si TDD no se ajusta a tus necesidades o encuentras barreras que dificultan su implementación, hay varias alternativas y estrategias que puedes considerar.

  • Desarrollo Dirigido por Comportamiento (BDD): BDD es una extensión del TDD que se centra más en la comunicación y colaboración entre los desarrolladores, QA y analistas. Este método se enfoca en obtener claridad sobre los comportamientos deseados del software antes de escribir el código, lo que puede ser más intuitivo si te preocupan más los resultados finales desde la perspectiva del usuario que los detalles técnicos iniciales.
  • Pruebas de Integración: Si el entorno de TDD te parece demasiado restrictivo o laborioso, puedes optar por centrarte en pruebas de integración robustas. Este enfoque permite a los desarrolladores escribir y experimentar con el código de manera más libre y luego verificar la correcta integración de todas las partes del sistema antes de la producción. Este es un buen punto de partida para los equipos que quieran empezar a implementar TDD y no saben por dónde empezar.
  • Programación Exploratoria: En proyectos donde la innovación y la exploración son prioritarias, la programación exploratoria permite a los desarrolladores crear y probar ideas rápidamente sin la necesidad de definir pruebas primero. Esto puede ser particularmente útil en fases de prototipado o cuando los requisitos del proyecto son aún inciertos o están en desarrollo.
  • Revisiones de Código y Pair Programming: Independientemente de si utilizas TDD, las revisiones de código y la programación en parejas son prácticas que pueden mejorar significativamente la calidad del software. Estas prácticas fomentan un entorno de colaboración donde múltiples ojos revisan el código, lo que ayuda a identificar y corregir errores antes de que lleguen a producción.
  • Pruebas Manual: Aunque las pruebas automáticas son un pilar del TDD, las pruebas manuales siguen siendo importantes, especialmente para casos de uso que son difíciles de prever o que requieren juicio humano, como la UX y la interfaz de usuario.

Elegir no utilizar TDD no significa que estés comprometiendo la calidad de tu proyecto ni que estés perdido en términos de mejores prácticas de desarrollo. Al final, la clave es encontrar un enfoque que funcione mejor para tu equipo, tu proyecto y tus objetivos específicos. Las metodologías de desarrollo son herramientas, y como cualquier herramienta, lo importante es saber cuándo y cómo usarlas de manera efectiva.

¿Qué opina la comunidad de Drupal sobre TDD?

A medida que Drupal continúa evolucionando, también lo hacen las prácticas y metodologías que la rodean. El TDD ha generado un debate intenso dentro de la comunidad, revelando una división significativa en cómo se percibe y se implementa esta metodología. Mientras que algunos ven TDD como una panacea para muchos de los problemas de desarrollo, otros lo critican por su rigidez percibida y la presión que puede poner sobre el proceso creativo.

Uno de los argumentos más frecuentes contra TDD es que la necesidad de escribir pruebas antes del código sofoca la innovación y la experimentación. Esto es particularmente relevante en el desarrollo de Drupal, donde la personalización y la flexibilidad son a menudo necesarias para satisfacer las necesidades específicas del cliente. La rigidez de TDD, argumentan algunos, puede llevar a un desarrollo que es menos adaptable y más cerrado a soluciones alternativas que podrían surgir durante un proceso más flexible.

Además, la curva de aprendizaje para implementar TDD correctamente es bastante pronunciada, especialmente combinada con la del propio Drupal. Para los nuevos desarrolladores, esta doble barrera de entrada puede ser la causa de abandonar esta tecnología o evitar la llegada de nuevos talentos.

Sin embargo, la mayor crítica hacia la forma en que se está tratando TDD, es que se promueve como una solución universal, sin suficiente consideración para cuándo es más adecuada o cómo podría adaptarse para ser más flexible. Los defensores de TDD argumentan que, a pesar de su rigidez inicial, los beneficios a largo plazo de tener un código más robusto y menos propenso a errores superan con creces cualquier desventaja inicial. Por ejemplo, en proyectos de Drupal de gran escala, donde el mantenimiento y la escalabilidad son críticos, TDD ha demostrado ser lo más recomendable.

¿Por qué no se trata bien TDD en Drupal?

En mi opinión, el tratamiento de TDD en la comunidad Drupal a menudo no toma en cuenta la diversidad y especificidad de los proyectos que se manejan dentro de esta plataforma. Es cierto que TDD puede ser una herramienta muy enriquecedora para asegurar la calidad y la sostenibilidad del código, pero su implementación no debería ser un "Todo o nada". La rigidez que se percibe en TDD no es un fallo de la metodología en sí, sino de cómo se enseña dentro de nuestra comunidad.

Drupal, como herramienta altamente adaptable que es, requiere un enfoque igualmente flexible hacia TDD. Esto significa adaptar la metodología a las necesidades del proyecto y del equipo, en lugar de adherirse estrictamente a principios que pueden no ser aplicables universalmente. La adopción de TDD debería ser vista como un espectro, no como un absoluto; deberíamos promover una versión más pragmática de TDD, una que permita a los desarrolladores la libertad de explorar y adaptar las pruebas a medida que el proyecto evoluciona.

En definitiva, en lugar de posicionarnos en extremos polarizados, debemos buscar un terreno común que reconozca los beneficios de TDD mientras se adapta a las realidades de desarrollo específicas de Drupal. Al hacer esto, no solo elevaremos la calidad del código que producimos, sino que también haremos que nuestra comunidad sea más acogedora para nuevo talento y empresas que aún no han decidido cómo integrar estas prácticas en su flujo de trabajo.

¿Y vosotros qué creéis? ¿El TDD es una buena herramienta para usar en los proyectos o un yugo que coarta al desarrollador? Dejádnoslo en los comentarios.

Comparte este artículo:
Publicado por CésarMSFelipe
Image

Hola a todos, soy desarrollador de Drupal, especializado en Backend, aunque a veces hago mis pinitos con Frontend, ¡Hasta sé centrar un div! Cuando no estoy sumergido en el código, probablemente me encontraréis explorando nuevos mundos en mis videojuegos favoritos o disfrutando de tiempo de calidad con los míos. Me apasiona combinar la tecnología con la creatividad, y siempre estoy buscando nuevas formas de aprender y crecer en mi campo. ¿Unimos fuerzas y creamos algo?
 

Si te gusta mi trabajo y quieres echar una mano:
Buy me a coffe!