Selenium WebDriver - Mesure de test en temps réel à l'aide de Grafana et InfluxDB

Bonjour Ă  tous! La semaine prochaine, les cours du groupe Java QA Engineer commenceront. Cette date coĂŻncidera avec la publication actuelle.



Revue:


L'exécution quotidienne de tests de régression automatisés dans le cadre de l'assemblage quotidien est inévitable pour le moment. C'est agréable de trouver et de signaler des bogues juste après les avoir trouvés. Dans le même temps, il est problématique d'exécuter des centaines de tests automatisés et l'exécution parallèle à distance. Dès que vous disposez d'un ensemble de tests de régression automatisés, vous pouvez le décomposer en plusieurs ensembles de modules métier et les exécuter en parallèle, dans le cadre d'un test de régression automatisé quotidien. La plupart de ces suites de tests s'exécutent sur une machine virtuelle distante et les résultats des tests ne sont disponibles qu'après leur exécution. Sinon, vous pouvez regarder dans la console jenkins pour voir les journaux du processus d'exécution du test. C'est parfois ennuyeux. Ce serait formidable d'avoir une application qui fournirait des informations sur la réussite du test pendant leur exécution sur des machines virtuelles distantes.

Voyons comment créer une page simple avec les résultats des tests et un tableau de bord à l'aide d'InfluxDB et de Grafana.

Objectif:


Nous collecterons toutes les métriques de test disponibles, telles que:

  • Statut de la mĂ©thode de test
  • DurĂ©e de la mĂ©thode d'essai
  • Statut de classe avec mĂ©thodes de test
  • ExĂ©cution de test de classe unique
  • Statut de la suite de tests
  • DurĂ©e du test


Nous pouvons obtenir certains des indicateurs en temps réel, comme indiqué ci-dessous:

  • Nombre de mĂ©thodes de test regroupĂ©es par statut (par exemple: rĂ©ussite: 30, Ă©chec: 2, ignorĂ©: 2) un jour particulier.
  • L'Ă©volution de la durĂ©e d'un ensemble de tests pour une semaine, un mois, une annĂ©e, etc.


InfluxDB:


InfluxDB est une base de données de séries chronologiques qui est utilisée pour collecter toutes les métriques de test. InfluxDB dispose d'une API REST pour écrire des données et envoyer des demandes. Vous pouvez en savoir plus ici . Ci-dessous, j'utilise la commande docker pour démarrer une instance d'InfluxDB.

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


Création d'une base de données:


Nous avons déjà créé et lancé la base de données InfluxDB. Créons un schéma de base de données distinct pour collecter les résultats des tests Selenium. Ci-dessous, j'exécute une commande dans le terminal pour créer un schéma appelé «sélénium» dans la base de données. (Vérifiez l'URL, remplacez localhost par hostname / ipaddress si vous n'êtes pas en cours d'exécution sur l'ordinateur actuel).

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


TestNG:


Créons un test 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(){ } } 


Notre objectif est de collecter les résultats des tests dans InfluxDB lors de l'exécution. Nous avons donc besoin d'un pilote / bibliothèque en Java pour InfluxDB.

Dépendances Maven:


Ajoutez les dépendances Maven indiquées ci-dessous:

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


Etudiants:


Les auditeurs TestNG sont parfaits pour écouter les événements et peuvent répondre en fonction de ce qui s'est passé. Commençons par créer une classe simple chargée d'envoyer les résultats à 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); } } 


Créez maintenant une autre classe qui implémente l'interface 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); } } 


Remarque: Utilisez une balise facultative qui répond à vos objectifs dans l'exemple ci-dessus pour classer les résultats. Par exemple, balise («scénario», «flux de connexion»).

L'auditeur de l'exemple ci-dessus surveillera l'exécution du test et dès qu'une certaine méthode / classe du test sera terminée, il enverra un nom, une durée et quelques détails supplémentaires. Mon objectif ici est juste de vous donner une idée. Modifiez le code selon vos besoins.

Ajoutez maintenant l'écouteur au package XML ou à la classe de 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> 


Ou bien:

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


Grafana:


Nous avons réussi à envoyer les résultats à InfluxDB. Mais comment demander des résultats et visualiser les données reçues? Pour cela, nous utiliserons un autre outil gratuit appelé «Grafana».
Grafana est un excellent outil de visualisation pour les données de séries chronologiques; il interagit parfaitement avec InfluxDB. Les commandes de docker suivantes permettent de créer une instance de Grafana. [le plugin fragmentaire est facultatif sur l'équipe, il peut être supprimé s'il n'est pas nécessaire]

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


Source de données pour Grafana:


Accédez à Paramètres -> Sources de données -> Ajouter une nouvelle source de données , comme indiqué dans la capture d'écran. Cliquez sur le bouton «Enregistrer et tester» pour vous assurer que Grafana peut communiquer avec InfluxDB.
Remarque: Si vous utilisez Grafana avec Docker et essayez d'accéder en tant que «serveur par défaut», N'UTILISEZ PAS localhost dans la chaîne de connexion InfluxDB. C'est parce que localhost est un conteneur Grafana, pas une machine physique. Par conséquent, le conteneur Grafana ne pourra pas trouver InfluxDB.




Création d'un tableau de bord:


J'aimerais que vous regardiez cette vidéo, car il n'est pas facile d'expliquer toutes les nuances de l'article. C’est pourquoi j’ai enregistré une vidéo d’hôtel.



Démo 2:


Pour résumer:


J'espère que l'obtention de résultats en temps réel en utilisant InfluxDB et Grafana s'est avérée intéressante et utile. Cela nécessite des changements minimes dans la structure existante, car nous utilisons des écouteurs TestNG. La suppression de l'écouteur du fichier de classe set / base suffit pour désactiver cette fonction si vous n'en avez pas besoin. Une telle approche permettra d'éviter une certaine frustration au sein de l'équipe si ses membres ne sont engagés que dans la surveillance des résultats des tests via les E / S de la console sur la machine distante. Cet article ne présente que l'idée principale. Vous pouvez améliorer cette approche en ajoutant plus d'informations, par exemple, un environnement de test, ajouter des filtres supplémentaires pour mettre à jour les données dans les graphiques pour un environnement / tests spécifique, etc.

Voici un document si court mais très utile. Traditionnellement, nous attendons vos commentaires et rappelons qu'aujourd'hui sera une journée portes ouvertes au rythme auquel tout le monde peut s'inscrire.

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


All Articles