RobotHace unos meses que no participo con notas en el sitio, esto se debe primero al nacimiento de Nico, mi tercer hijo y luego a una inminente y complicada decisión y mudanza al fin. Recién esta semana estoy volviendo a tener la cabeza despejada, y aunque el reader explota y por raro que parezca, no encuentro la nota que me guste mucho, eso debe ser que ahora me fui al extremo de no pensar en nada....

Bueno, les dejo aquí algo que me agrado y es un buen aspecto desde donde ver las pruebas unitarias automatizadas y explicarselas a los gerentes en términos monetarios.

Hoy hay consenso en la ingeniería de software y en la comunidad ágil que realizar pruebas unitarias automátizadas es una práctica técnica fundamental para mejorar la calidad del producto de software. Además de eso, Michael Feathers en su excelente libro "Working Effectively with Legacy Code" estudió y llegó a una conclusión muy interesante y fundamental: ¿Qué es un sistema legado? Es aquel que el código no tiene un conjunto completo de pruebas unitarias automatizadas

Por qué no hacer pruebas unitarias: las excusas

A pesar de la evidencia, la mayoría de los proyectos de software y sistemas en el mercado mundial no poseen suites de pruebas unitarias automatizadas. Por lo tanto, la mayoría de los sistemas ya "legados" desde el momento en que entran en producción! Las razones principales expresadas por las personas (y que veremos son disculpas, porque no se justifica) para no realizar pruebas unitarias automatizadas son: 

  • El costo de colocar actividades de pruebas unitarias automatizadas encarecerá el proyecto
  • El cronograma será más largo y por lo tanto demoraré mas en entregar
  • Mi equipo no sabe o no están capacitados para realizar pruebas unitarias automátizadas 

El propósito de este artículo es justamente desmantelar estas excusas y mostrar los beneficios económicos de realizar las pruebas unitarias automatizadas. Los beneficios económicos de la utilización de pruebas unitarias evidenciará que no realizarlas es una actitud irracional desde el punto de vista económico

Pruebas unitarias: los beneficios clásicos

Veamos primero cuáles son los beneficios de una suite de pruebas unitarias automátizadas: 

  • Detección inmediata de defectos en métodos. Estos defectos tienden a ser fácilmente identificados en las pruebas unitarias; existe un mayor costo de análisis y corrección cuando recién se los identifica en una prueba funcional del sistema. 
  • Mejor diseño detallado y arquitectura, porque las pruebas unitarias fuerzan a los desarrolladores a mejorar su diseño para que se torne comprobable (el famoso "design for testability") 
  • Código más estructurado y menos complejo
  • Mejor documentación del código. Cada prueba unitaria cuenta la historia y los objetivos de un método. 
  • Mayor facilidad de refactorización del código, lo que reduce el tiempo invertido en el mantenimiento de la evolución.
  • Disminución del tiempo de detección y corrección del mantenimiento correctivo, ya que el conjunto de pruebas unitarias automatizadas garantiza que un cambio en una o más partes del código no afecta a otras funciones. 

El beneficio económico

Ahora echemos un vistazo a los costos. Una de las justificaciones para no usar las pruebas unitarias automatizadas es el costo de las actividades para realizarlas. A continuación, veremos que esto es un mito y una falacia.

Muchos gerentes de proyectos que no conocen profundamente de ingeniería de software cometen el error de creer que el costo aumentará en gran medida. El problema es que ellos creen que el desarrollador apenas codifica, no prueba. Este es un gran error. Todo desarrollador que sea mínimamente profesional pasará tiempo probando su código. Sin embargo, muchos todavía hacen esas "pruebas" en forma totalmente manual y usando una herramienta que debería ser muy raramente utilizada (sólo en casos extremos): el debug de código. Los gerentes piensan que los desarrolladores no prueban, pero ellos realizan "pruebas": de forma manual o depurando el código. Por lo tanto, los desarrolladores realizan una actividad que no tiene como salida un artefacto evidente. Esta actividad "invisible" en el cronograma de los gerentes será en su mayoría reemplazada por una actividad con artefactos útiles y evidentes: las pruebas unitarias automatizadas. Esto detona los dos primeros mitos que llevan a los equipos a no hacer las pruebas unitarias automatizadas: mayor costo y mayor tiempo de cronograma. 

Pero consideremos al equipo que no tiene experiencia en la automatización de pruebas unitarias. Vamos a considerar entonces que los costos del proyecto aumentarán en un 10% (este es un número muy elevado, lo cual no ocurrirá; en la práctica, el equipo será más productivo realizando la automatización). En un proyecto de $1,000,000.00 habría un gasto adicional de $100,000.00 en la capacitación para el equipo y en el tiempo extra para que se acostumbren a lograr la automatización. 

Vamos ahora a dar números económicos a los beneficios de las pruebas unitarias automatizadas: 

  • El mejor diseño, código estructurado, documentación y detección inmediata de los defectos puede reducir un 10% a 50% de las pruebas funcionales y sobre todo las de aceptación y aprobación (lo que reduce la necesidad de dos o más ciclos/batería de pruebas y reduce el número de defectos detectados y a corregir en el momento de la aprobación). Ademas de eso, mejora la percepción y la calidad de la imagen del equipo. Véase Boehm para esta conclusión. 
  • Durante el período de mantenimiento evolutivo y correctivo (el período en que el sistema entra en producción, y eso es un promedio del 80% del ciclo de vida de esta aplicación) el tiempo y costo de los desarrolladores invertido para hacer cambios y correcciones se reduce en torno a 10% al 30%. Esto se debe a la existencia de la suite de pruebas unitarias automatizadas que sirve como documentación, facilita la detección de defectos recurrentes y potencia la refactorización del código para permitir la inclusión de nuevas características sin necesidad de aumentar la entropía del sistema. 

Así que vamos a considerar que en nuestro sistema de ejemplo de $1.000.000 cerca del 30% del presupuesto será para pruebas funcionales y del sistema (sin el uso de pruebas unitarias automatizadas). Por lo tanto, podemos reducir hasta $150.000 (en el peor de los casos la reducción sería de $30.000) de las pruebas funcionales y gastar $100.000 para las pruebas unitarias automatizadas (fuera de la reducción de las pruebas manuales y de debug de los desarrolladores). 

Vamos a considerar, como ejemplo, que durante la vida de este proyecto se gastan más de $10.000.000 de mantenimiento evolutivo y correctivo. Con la suite de pruebas unitarias automatizadas el costo se reduciría entre $1.000.000 y $3.000.000! 

Costo del proyecto con automatización de pruebas unitarias automatizadas: el mismo, ya que simplemente transferimos las actividades "invisibles" (como de depuración y las "pruebas" manuales de los desarrolladores) y también reducimos el número de ciclos de pruebas del sistema y de aprobación (por lo tanto  transfiere costos de las pruebas del sistema a las pruebas unitarias automatizadas). 

Beneficio para el mantenimiento del sistema en producción: reducción de al menos un millón (reducción pesimista) sobre una inversión de 10 millones durante la vida útil del software. 

En resumen, el costo durante el proyecto casi empata si realiza las pruebas unitarias automatizadas o incluso puede ser inferior. Además de eso, podremos obtener como beneficio intangible la percepción de mejora de la calidad, pues los analistas de pruebas y los clientes encontrarán menos defectos en las pruebas del sistema y en las pruebas de aprobación. Y su costo después de la implementación en producción será mucho menor, lo que traerá un retorno sobre la inversión excelente sobre las pruebas unitarias automatizadas hechas. 

La automatización de pruebas unitarias es económicamente relevante para el proveedor (ya que mejora la calidad y la imagen), pero aún más relevante para el comprador (ya que hay un beneficio económico real). Va ahí entonces el consejo para el proveedor: rRealice las pruebas unitarias automatizadas y entreguelo como algo de valor en su servicio. Para el cliente: exija siempre un conjunto de pruebas unitarias automatizadas junto con el producto de software. 

Reforzando: no crear un conjunto completo de pruebas unitarias automatizadas es una actitud irracional desde el punto de vista económico.

 Traducido de Benefícios econômicos da automação de testes unitários - Sua suite de testes é tão valiosa quanto seu código!

 

Inspiración.

"Si tú tienes una manzana y yo tengo una manzana e intercambiamos las manzanas, entonces tanto tú como yo seguiremos teniendo una manzana cada uno. Pero si tú tienes una idea y yo tengo una idea, e intercambiamos las ideas, entonces ambos tendremos dos ideas"

Bernard Shaw