Una parte fundamental de la práctica de automatización de pruebas es el análisis de los reportes generados luego de la ejecución, ya que aportan información importante sobre la calidad del artefacto sometido a pruebas, visión objetiva de su rendimiento y, quizá lo más importante, facilita la toma de decisiones en el proyecto.
Aunque los reportes de Selenium y Serenity nos permiten verificar el estado final de los escenarios de pruebas, no nos proporcionan más información importante como métricas de la duración promedio de cada escenario de prueba o cuales son los escenarios que más fallan a través del tiempo. Adicional a esto, cuando tenemos set de pruebas robustos con ejecuciones que tardan más de lo esperado, tendríamos que esperar a que finalice la ejecución para poder revisar el reporte generado.
¿Por qué Dashboards en tiempo real?
Al tener una observabilidad en tiempo real del comportamiento de nuestras pruebas, tenemos acceso instantáneo y dinámico a los resultados de las ejecuciones, lo cual permite a los stakeholders tomar decisiones más rápidamente, y al equipo de QA ajustar, de ser necesario, los escenarios de prueba o reportar defectos al equipo de desarrollo a medida que corre la ejecución.
Herramientas
InfluxDB v1.8.10 Open source https://www.influxdata.com/downloads/
Grafana v8.5.3 https://grafana.com/grafana/download/8.5.3?edition=oss
Dependencias:
TestNG v7.8.0
influxdb-client-java v6.10.0
Implementación
Debemos tener como punto de partida un proyecto de pruebas automatizadas que se ejecute con TestNG, allí es donde se va a implementar el reporte en tiempo real.
Lo primero que debemos hacer es capturar los datos en tiempo de ejecución, para ello usaremos ITestListener de TestNG, el cual es un oyente que captura la información.
Iniciamos creando una clase InfluxDBListener que implemente ITestListener de la siguiente manera:
Luego, creamos una clase InfluxDBHelper que va a contener nuestra conexión con InfluxDB y un método que nos permite escribir en la base de datos por medio de lo que Influxdb llama Point, que no es más que un registro único en la base de datos.
Posteriormente, debemos ir a nuestra clase ITestListener y crear los métodos que necesitamos para construir los Points para el registro en la base de datos. En este caso, se creó el método sendTestCaseStatus para enviar la información de cada caso de prueba y el método sendScenarioStatus para la información del escenario de prueba.
En influxDB, measurement hace referencia a la tabla donde se van a guardar los datos. Para este ejemplo, creamos las tablas testcase y scenario, para guardar la información.
Luego, simplemente debemos usar el tag @Listeners de testNG en nuestra clase ejecutable, enviando la ubicación del listener que creamos anteriormente:
Ahora, debemos ejecutar localmente el servidor de InfluxDB (el archivo influxd) y el servidor de Grafana (grafana-server). Una vez estos se encuentren arriba, debemos ingresar a http://localhost:3000/ y loguearnos en Grafana, para agregar nuestro data source de InfluxDB (para esto se puede seguir la documentación de grafana en el siguiente link: https://grafana.com/docs/grafana/latest/datasources/influxdb/)
Luego, podemos ejecutar nuestro set de pruebas y verificar que este llegando correctamente la información a grafana, de la siguiente manera:
Finalmente, creamos nuestros dashboard en grafana para representar la información recibida; creando primero el query con la consulta que queremos representar y agregamos un nuevo dashboard:
En esta consulta de ejemplo simplemente estamos trayendo la cantidad de casos de prueba fallidos y exitosos. Luego editamos el dashboard que hemos creado, cambiando la visualización de los datos de tabla a pie chart:
Cambiamos el título y los valores para mostrar los diferentes estados de los casos de prueba:
Para mejor visibilidad podemos cambiar el color de referencia de los casos fallidos:
Finalmente guardamos los cambios y tendríamos el dashboard en el panel principal, el cual se va actualizando a medida que se van ejecutando las pruebas.
Podemos crear los dashboards deseados dependiendo de los datos que consideremos importantes para analizar en el proceso de nuestras pruebas automatizadas.
Conclusión
El análisis de las pruebas en tiempo real es de suma importancia para el monitoreo del comportamiento de las ejecuciones, permitiendo así dar más agilidad y proactividad a los equipos para gestionar las diferentes anomalías, errores o cuellos de botella que se lleguen a evidenciar; disminuyendo notablemente tiempos muertos que se tenían anteriormente en esperas de reportes finales de pruebas.