07. Validaciones Automatizadas
Las validaciones automatizadas consisten en una máquina que ejecuta verificaciones o casos de prueba automáticamente, leyendo sus especificaciones mediante scripts en un lenguaje de programación de propósito general o uno que sea específico de una herramienta, desde hojas de cálculo, modelos, etc. El objetivo de la automatización es aumentar el "ancho de banda" de los testers, al automatizar ciertos procesos repetitivos y tediosos, para que puedan abocarse a tareas más desafiantes.
Principales beneficios de la automatización:
- Ejecutar más pruebas en menos tiempo, acelerando el time to market y aumentando la cobertura.
- Mejora de la imagen para ganar mayor confianza por parte del usuario.
- Capacidad de ejecución multiplataforma.
- Evaluación del rendimiento de la aplicación en diferentes versiones y a largo plazo.
- Ejecución sistemática: probar siempre lo mismo y de la misma manera, sin perder ningún paso de verificación.
- Detección temprana de errores para reducir los costos de su resolución.
- Mejorar la motivación de los testers, liberándolos de tiempo para actividades más desafiantes.
- Facilitar la integración continua (CI).
Uno de los objetivos esperados de la automatización es recibir información sobre el estado de la calidad del software anticipadamente, y reducir los costos de las pruebas y en general del desarrollo.
Es bien sabido que la automatización del caos genera un caos más rápido. Para el éxito del testing automatizado, es esencial seleccionar adecuadamente qué casos automatizar en cada nivel y elegir los que prometen un mayor retorno de la inversión.
El problema más común es que se cree que la automatización consiste en automatizar las acciones a nivel de interfaz gráfica del usuario, conocida también como GUI (del inglés Graphical User Interface), pero no es la única ni la mejor opción. Para comprender mejor esto, mira a continuación la pirámide de automatización de pruebas de Mike Cohn:
La pirámide de automatización de pruebas de Cohn establece que existen varios niveles de validación, indicando en qué medida deben automatizarse. El escenario ideal sería tener:
- Muchas pruebas/validaciones unitarias automatizadas durante el desarrollo, ya que es un punto principal para detectar incidentes. Si una función falla en este punto, las pruebas/validaciones podrían fallar en los niveles siguientes: integración, API, etc.
- Algunas pruebas/validaciones a nivel de API e integración de componentes y servicios, que son las candidatas más estables para la automatización.
- Pruebas/validaciones de GUI menos automatizadas, ya que son más difíciles de mantener, más lentas de ejecutar que otras y dependen de muchos otros componentes.
La realización de pruebas/validaciones a nivel de interfaz gráfica de usuario brinda un mayor grado de seguridad porque verifican la funcionalidad de principio a fin. Sin embargo, no es recomendable apuntar a tener solo este tipo de checks automáticos, ni que representen la mayoría del set de pruebas.
Como referencia, Google afirma tener el 70 % de sus validaciones automatizadas a nivel de unidad, el 20 % a nivel de API y solo el 10 % a nivel de GUI.
El objetivo de este enfoque es que llegue un momento en que cada vez se logre una mayor cobertura de pruebas, invirtiendo la misma cantidad de recursos.
Hay una situación muy interesante que ocurre en este nivel. El diseño y programación de casos de pruebas unitarias siempre ha sido un dilema para el desarrollador de software. Las pruebas unitarias son un paso fundamental para agregar una pieza de código al sistema, pero no siempre hay suficiente tiempo, recursos o voluntad para hacerlo. Si bien este nivel de pruebas se reconoce como una buena práctica para mejorar la calidad del código y evitar la deuda técnica, también es cierto que, comúnmente, al diseñar, preparar y planificar para completar una tarea de programación, se dejan de lado cosas que no se consideran absolutamente relevantes, y, por tanto, las pruebas unitarias se dejan fuera. En Abstracta recomendamos encarecidamente considerar siempre los tests unitarios.
Probablemente en este punto radique el problema: las pruebas unitarias no se consideran parte del desarrollo y terminan siendo consideradas como una actividad de soporte opcional.
Claramente, las validaciones automatizadas de la unidad son sumamente útiles para un enfoque de integración continua, en el que los errores se identifican anticipadamente.
Además, es fundamental definir una buena estrategia para las validaciones automatizadas siguiendo la pirámide de Mike Cohn: una base fuerte en pruebas unitarias, algunas pruebas a nivel de servicio y solo las más críticas a nivel de interfaz gráfica. Es importante considerar siempre la mantenibilidad de las pruebas para mantener una buena relación costo-beneficio.
Las validaciones automatizadas son las pruebas más importantes a nivel funcional. La verdad es que no es posible lograr una integración continua sin dichas verificaciones, por lo que es aconsejable que los equipos las ejecuten periódicamente.