Selenium WebDriver: m茅trica de prueba en tiempo real con Grafana e InfluxDB

Hola a todos! La pr贸xima semana, comenzar谩n las clases en el grupo de Ingeniero de Java QA . Esto se programar谩 para coincidir con la publicaci贸n actual.



Revisi贸n:


La ejecuci贸n diaria de pruebas de regresi贸n automatizadas como parte del ensamblaje diario es inevitable en este momento. Es bueno encontrar e informar errores inmediatamente despu茅s de encontrarlos. Al mismo tiempo, es problem谩tico ejecutar cientos de pruebas automatizadas y ejecuci贸n paralela remota. Una vez que tenga un conjunto de pruebas de regresi贸n automatizadas, puede dividirlo en varios conjuntos de m贸dulos comerciales y ejecutarlos en paralelo, como parte de una prueba de regresi贸n autom谩tica diaria. La mayor铆a de estos conjuntos de pruebas se ejecutan en una m谩quina virtual remota, y los resultados de las pruebas solo est谩n disponibles una vez que se han ejecutado. De lo contrario, puede buscar en la consola de jenkins para ver los registros del proceso de ejecuci贸n de la prueba. Esto a veces es molesto. Ser铆a genial tener una aplicaci贸n que proporcione informaci贸n sobre c贸mo pasar la prueba mientras se ejecutan en m谩quinas virtuales remotas.

Veamos c贸mo puede crear una p谩gina simple con resultados de pruebas y un tablero usando InfluxDB y Grafana.

Prop贸sito


Recopilaremos todas las m茅tricas de prueba disponibles, como:

  • Estado del m茅todo de prueba
  • M茅todo de prueba Duraci贸n
  • Estado de clase con m茅todos de prueba
  • Tiempo de ejecuci贸n de prueba de clase 煤nica
  • Probar estado de suite
  • Duraci贸n de la prueba de funcionamiento


Podemos obtener algunos de los indicadores en tiempo real, como se muestra a continuaci贸n:

  • El n煤mero de m茅todos de prueba agrupados por estado (por ejemplo: Pase: 30, Fallido: 2, Saltado: 2) en un d铆a en particular.
  • La tendencia en la duraci贸n del conjunto de pruebas durante una semana, mes, a帽o, etc.


InfluxDB:


InfluxDB es una base de datos de series de tiempo que se utiliza para recopilar todas las m茅tricas de prueba. InfluxDB tiene una API REST para escribir datos y enviar solicitudes. Puedes aprender m谩s aqu铆 . A continuaci贸n, uso el comando docker para iniciar una instancia de InfluxDB.

sudo docker run -p 8086:8086 -v $PWD:/var/lib/influxdb influxdb 


Crear una base de datos:


Ya hemos planteado y lanzado la base de datos InfluxDB. Creemos un esquema de base de datos separado para recopilar los resultados de la prueba de selenio. A continuaci贸n ejecuto un comando en la terminal para crear un esquema llamado "selenio" en la base de datos. (Verifique la URL, reemplace localhost con hostname / ipaddress si no est谩 ejecutando en la computadora actual).

 curl -i -XPOST http://localhost:8086/query --data-urlencode "q=CREATE DATABASE selenium" 


TestNG:


Creemos una prueba testNG simple:

 public class SampleTest { @Test(description = "login") public void login(){ } @Test(description = "search for flights", dependsOnMethods = "login") public void search(){ } @Test(description = "select flight", dependsOnMethods = "search") public void select(){ } @Test(description = "book flight", dependsOnMethods = "select") public void book(){ } @Test(description = "logout", dependsOnMethods = "book") public void logout(){ } } 


Nuestro objetivo es recopilar resultados de pruebas en InfluxDB en tiempo de ejecuci贸n. Por lo tanto, necesitamos un controlador / biblioteca en Java para InfluxDB.

Dependencias de Maven:


Agregue las dependencias de Maven que se muestran a continuaci贸n:

 <dependency> <groupId>org.influxdb</groupId> <artifactId>influxdb-java</artifactId> <version>2.12</version> </dependency> 


Estudiantes:


Los oyentes de TestNG son excelentes para escuchar eventos y pueden responder dependiendo de lo que sucedi贸. Primero, creemos una clase simple que sea responsable de enviar los resultados a InfluxDB.

 import org.influxdb.InfluxDB; import org.influxdb.InfluxDBFactory; import org.influxdb.dto.Point; public class ResultSender { private static final InfluxDB INFLXUDB = InfluxDBFactory.connect("http://localhost:8086", "root", "root"); private static final String DATABASE = "selenium"; static{ INFLXUDB.setDatabase(DATABASE); } public static void send(final Point point){ INFLXUDB.write(point); } } 


Ahora cree otra clase que implemente la interfaz ITestListener.

 import org.influxdb.dto.Point; import org.testng.ITestContext; import org.testng.ITestListener; import org.testng.ITestResult; import java.util.concurrent.TimeUnit; public class ExecutionListener implements ITestListener { public void onTestStart(ITestResult iTestResult) { } public void onTestSuccess(ITestResult iTestResult) { this.sendTestMethodStatus(iTestResult, "PASS"); } public void onTestFailure(ITestResult iTestResult) { this.sendTestMethodStatus(iTestResult, "FAIL"); } public void onTestSkipped(ITestResult iTestResult) { this.sendTestMethodStatus(iTestResult, "SKIPPED"); } public void onTestFailedButWithinSuccessPercentage(ITestResult iTestResult) { } public void onStart(ITestContext iTestContext) { } public void onFinish(ITestContext iTestContext) { this.sendTestClassStatus(iTestContext); } private void sendTestMethodStatus(ITestResult iTestResult, String status) { Point point = Point.measurement("testmethod") .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) .tag("testclass", iTestResult.getTestClass().getName()) .tag("name", iTestResult.getName()) .tag("description", iTestResult.getMethod().getDescription()) .tag("result", status) .addField("duration", (iTestResult.getEndMillis() - iTestResult.getStartMillis())) .build(); ResultSender.send(point); } private void sendTestClassStatus(ITestContext iTestContext) { Point point = Point.measurement("testclass") .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS) .tag("name", iTestContext.getAllTestMethods()[0].getTestClass().getName()) .addField("duration", (iTestContext.getEndDate().getTime() - iTestContext.getStartDate().getTime())) .build(); ResultSender.send(point); } } 


Nota: Use una etiqueta opcional que cumpla con sus objetivos en el ejemplo anterior para clasificar los resultados. Por ejemplo, etiqueta ("escenario", "flujo de inicio de sesi贸n").

El oyente del ejemplo anterior supervisar谩 la ejecuci贸n de la prueba y tan pronto como se complete un cierto m茅todo / clase de la prueba, enviar谩 un nombre, duraci贸n y algunos detalles adicionales. Mi objetivo aqu铆 es solo darte una idea. Cambia el c贸digo seg煤n tus necesidades.

Ahora agregue el oyente al paquete XML o a la clase base TestNG.

 <suite name="My suite"> <listeners> <listener class-name="com.tag.realtime.ExecutionListener" /> </listeners> <test name="Test1"> <classes> <class name="com.tag.realtime.SampleTest"/> </classes> </test> <test name="Test2"> <classes> <class name="com.tag.realtime.Sample2Test"/> </classes> </test> </suite> 


O si no:

 @Listeners(ExecutionListener.class) public class SampleTest { @Test public void test(){ } } 


Grafana


Logramos enviar los resultados a InfluxDB. Pero, 驴c贸mo solicitar resultados y visualizar los datos recibidos? Para esto utilizaremos otra herramienta gratuita llamada "Grafana".
Grafana es una excelente herramienta de visualizaci贸n para datos de series temporales; interact煤a perfectamente con InfluxDB. Los siguientes son comandos de Docker para crear una instancia de Grafana. [el complemento de gr谩fico circular es opcional en el equipo, se puede eliminar si no es necesario]

 docker run -d -p 3000:3000 --name=grafana \ -e "GF_INSTALL_PLUGINS=grafana-piechart-panel" \ -v $PWD:/var/lib/grafana \ grafana/grafana 


Fuente de datos para Grafana:


Vaya a Configuraci贸n -> Fuentes de datos -> Agregar nueva fuente de datos , como se muestra en la captura de pantalla. Haga clic en el bot贸n 'Guardar y probar' para asegurarse de que Grafana pueda comunicarse con InfluxDB.
Nota: Si est谩 utilizando Grafana con Docker e intenta acceder como 'Servidor predeterminado', NO use localhost en la cadena de conexi贸n InfluxDB. Eso es porque aqu铆 localhost es un contenedor Grafana, no una m谩quina f铆sica. Por lo tanto, el contenedor Grafana no podr谩 encontrar InfluxDB.




Crear un tablero de instrumentos:


Me gustar铆a que veas este video, porque no es f谩cil explicar todos los matices del art铆culo. Por eso grab茅 un video de hotel.



Demo 2:


Para resumir:


Espero que obtener resultados en tiempo real usando InfluxDB y Grafana haya resultado interesante y 煤til. Requiere cambios m铆nimos en la estructura existente, porque usamos oyentes TestNG. Eliminar el oyente del archivo de clase set / base es suficiente para deshabilitar esta funci贸n si no la necesita. Tal enfoque ayudar谩 a evitar cierta frustraci贸n en el equipo si sus miembros solo se dedican a monitorear los resultados de la prueba a trav茅s de E / S de consola en la m谩quina remota. Este art铆culo solo expone la idea principal. Puede mejorar este enfoque agregando m谩s informaci贸n, por ejemplo, un entorno de prueba, agregue filtros adicionales para actualizar los datos en gr谩ficos para un entorno / pruebas espec铆ficos, etc.

Aqu铆 hay un material tan breve pero bastante 煤til. Tradicionalmente, estamos a la espera de sus comentarios, as铆 como recordamos que hoy ser谩 un d铆a de puertas abiertas a la velocidad a la que cualquiera puede inscribirse.

Source: https://habr.com/ru/post/452908/


All Articles