Test Driven Development: su aporte a la calidad del software

En este artículo, veremos cómo el uso del desarrollo guiado por pruebas afecta la calidad del software, tomando en cuenta algunos aspectos importantes que son representativos para la calidad. También es cierto que pueden existir algunas desventajas, las cuales quedan para una próxima entrada.

Atributos de la calidad del software

            Si bien sabemos que la calidad es difícil de definir, para el caso del software, se presenta a continuación algunos atributos que se identifican como propulsores de la calidad en los sistemas de información.

Atributos de calidad – ISO 9126:

  • Funcionalidad: el grado en el cual las necesidades explícitas e implícitas que dieron origen al sistema fueron satisfechas.
  • Confiabilidad: denota la capacidad de un sistema de funcionar en distintas condiciones, por ejemplo, de carga. También es definida por la tolerancia a los fallos.
  • Facilidad de uso: apunta a lo fácil que resulta utilizar el sistema, así como también aprender a usarlo.
  • Eficiencia: descripta por el uso que hace el sistema de los recursos con los que cuenta. Mayor eficiencia implica menor uso de recursos. Los recursos son ancho de banda, memoria, ciclos de procesador, etc.
  • Facilidad de mantenimiento: la facilidad de encontrar y solucionar un defecto del sistema, así como la verificabilidad des mismo, es decir, la facilidad con la que el sistema puede ser probado.
  • Portabilidad: habilidad del software para adaptarse a cambios en el ambiente o en los requerimientos.

Ventajas de aplicar Desarrollo Guiado por Pruebas

            En este apartado se enumeran las ventajas que tiene este proceso, y trato de brindar, desde mi punto de vista y experiencia, como aporta valor a la calidad del software, teniendo en cuenta los atributos de calidad mencionados en el apartado anterior.

Trae un diseño mejor de las interfaces del sistema

            El hecho de pensar los casos de prueba antes, el desarrollador piensa más acerca de cómo el usuario final va a utilizar el sistema, entonces diseña las interfaces más temprano en el proceso. Esto va a desembocar en un sistema con mayor facilidad de uso, elevando el atributo de calidad Usabilidad.

Aumenta la confianza en el código

            El proceso hace que el desarrollador de «pasos pequeños», ya que crea un caso de prueba para un aspecto particular de una funcionalidad, y luego escribe el código para que esa prueba sea exitosa. Con el correr del tiempo, se cuenta con una batería de pruebas que aseguran, en cierto nivel, un buen funcionamiento del sistema. Por ende, el sistema final tendrá menos errores.

            Sería todavía mejor si el cliente, el dueño del producto (Scrum), o cualquiera que esté familiarizado con el problema, pueda brindar algunos casos de prueba para que sean pasados a código fuente.

            El atributo de calidad Confiabilidad se ve beneficiado.

Se reduce el número de errores del sistema

            Encontrar y solucionar un defecto luego de la entrega a menudo es 100 veces más caro que encontrarlo y solucionarlo durante la fase de requerimientos y diseño. Por ende, al escribir casos de prueba durante el desarrollo, estamos validando los requerimientos en contra del sistema en sí. Esto desemboca en un gran número de casos que serían causas de defectos posteriores ya siendo probados durante el desarrollo, lo que permite reducir el número de defectos encontrados más tarde, reduciendo los costos.

            Aumenta la Confiabilidad y también la Facilidad de Mantenimiento.

Arquitectura y código más simples

            El código se va escribiendo junto con las pruebas. El desarrollador va pensando en cada unidad como «testeable», lo que desencadena en una separación natural de las funcionalidades. El hecho de pensar y escribir las funcionalidades de esta forma, favorece un diseño y arquitectura simples.

            Una arquitectura simple hace que sea más fácil entenderla, por lo que también será más fácil modificarla. La escritura de pruebas y funcionalidad modulares evita, intrínsecamente, que el desarrollador escriba código «espagueti», lo que lleva a que el código en sí mismo sea más modificable.

            Se aumenta la Facilidad de mantenimiento del sistema.

Las pruebas tienden a cubrir todas las ramas del código

            Al no escribir más código que el necesario para pasar la prueba, los casos de prueba tienden a cubrir todas los posibles caminos que pueden encontrarse en el código. El hecho de tener una batería de pruebas que cubre todos los caminos posibles del código, aumenta el nivel de la calidad, ya que sin dudas habrá menos defectos.

            Sin dudas esto beneficia la Confiabilidad.

La refactorización promueve las mejoras

            El tercer paso del ciclo del desarrollo guiado por pruebas es la refactorización o la mejora del diseño. Sin dudas, una mejora en la calidad del código, traerá aparejada una mejora en la calidad del sistema, ya que puede impactar en aspectos como mejor performance, mejores tiempos de respuesta, aumento en la legibilidad del código (mejor mantenibilidad), mejoras en la arquitectura, etc.

            En los enfoques «Test Last» tradicionales, una vez que el desarrollador entrega el código para que sea testeado, ya no es capaz de hacer cambios al mismo, además de un temor natural que existe a «romper» o generar defectos en otras partes del sistema. La potencia de tener las pruebas escritas es que le dan al desarrollador una herramienta para asegurarse, luego de cualquier cambio, que el sistema sigue en el mismo estado que antes.

            La refactorización es un paso hacia un mejor código y arquitectura. También es un paso hacia la simpleza. La excelencia técnica y la simplicidad sin dudas van de la mano con la refactorización.

            La refactorización continua del código favorece la Facilidad de mantenimiento, así como también la Eficiencia.

Documentación exacta y precisa

            Un problema que se presenta generalmente con las metodologías tradicionales es que los cambios introducidos en etapas de desarrollo no son reflejados en la documentación. Esto conlleva a que cuando un desarrollador está leyendo, por ejemplo, un caso de uso, éste no se encuentre debidamente actualizado, y no represente realmente lo que pasa en el código. La mantenibilidad del sistema se ve afectada, resultando en menos calidad.

            Para varios autores (como por ejemplo Robert Martin), el código es la mejor documentación que un sistema puede tener. El código refleja exactamente lo que el sistema hace, y cómo lo hace. Siguiendo este principio, el hecho de tener casos de prueba en código, aumenta drásticamente el entendimiento que uno puede tomar sobre el sistema, ya que el lector se encuentra con ejemplos claros de valores de entrada y salida que el sistema tendrá en su funcionamiento.

            Eliminar ambigüedades en la lectura de la documentación del sistema aumenta la Facilidad de mantenimiento del mismo, aumentando su calidad.

Facilita la introducción de cambios en los requerimientos

            Es muy frecuente que en etapas avanzadas del desarrollo surjan cambios en los requerimientos, ya sea porque estaban mal especificados de un principio, o hay que ajustar el comportamiento por cambios propios en el dominio del problema.

            Al contar con pruebas automatizadas, cuando llega el momento de realizar un cambio, el proceso se simplifica, por las siguientes razones:

  • se cumple el ciclo, se codifica una prueba para el cambio, se agrega el código para que pase la prueba, y luego refactorizar. Esto desemboca en código que es agregado y que funciona (calidad alta).
  • se puede verificar rápidamente, corriendo los tests existentes, si el cambio introdujo o no defectos en otras partes del sistema. Esto es muy difícil de realizar con metodologías tradicionales, debido a que es complejo recordar que parte del sistema se verá afectada por un cambio.

            Esto sin dudas aumenta la calidad final del sistema, ya que permite que los cambios (que seguramente existirán) sean introducidos mejor en el sistema, obteniendo un código más probado. Se mejora la Portabilidad.

Aumenta la motivación del desarrollador

            Este es un punto clave, según mi opinión. Veamos el siguiente principio de las metodologías ágiles:

  • Los proyectos se desarrollan en torno a individuos motivados. Hay que darles el entorno y el apoyo que necesitan, y confiarles la ejecución del trabajo.

            El empleo del desarrollo guiado por pruebas aumenta la motivación del desarrollador, debido a que, durante el desarrollo normal del proceso, siente que va agregando valor al sistema cuando el código que introduce pasa las pruebas. Es claro que un desarrollador motivado está en condiciones de producir mejor código agregando más calidad al sistema.

Facilita el conocimiento del dominio

            Muchas veces el desarrollador tiene que leer código para ver como desarrollar sus casos de prueba, por lo que va incorporando conocimientos del dominio y del sistema a medida que va agregando valor.

            Mejora la Facilidad de mantenimiento.

Conclusiones

            En mi opinión personal, el desarrollo guiado por pruebas es una de las herramientas más potentes a la hora de desarrollar software, la cual conjugada con otras como revisión de código e integración contínua, garantizan un desarrollo potable de software de alta calidad.

            En mi experiencia particular, puedo dar fe de la potencia del proceso, debido a que lo he usado en numerosas ocaciones, siempre con resultados positivos (es decir, cumplimiento de objetivos y código entregado funcionando correctamente).

            Vale la pena destacar que hoy en día, hay tecnologías que directamente exigen un mínimo de cobertura de código testeado con pruebas de unidad. Por ejemplo, la plataforma SalesForce –http://www.salesforce.com/ – exige un mínimo de un 70% del código testeado con pruebas de unidad. Sin dudas, esos casos son una gran oportunidad para aplicar el desarrollo guiado por pruebas.

            En este post no se vió en detalle el desarrollo guiado por pruebas, pero para más información se puede consultar en:

Tags

Access top talent now!

Related

Get in Touch