Selenium WebDriver - Echtzeit-Testmetrik mit Grafana und InfluxDB

Hallo allerseits! Nächste Woche beginnen die Kurse in der Java QA Engineer- Gruppe. Dies wird zeitlich auf die aktuelle Veröffentlichung abgestimmt.



Bewertung:


Die tägliche Durchführung automatisierter Regressionstests im Rahmen der täglichen Montage ist derzeit unvermeidlich. Es ist schön, Fehler direkt nach dem Auffinden zu finden und zu melden. Gleichzeitig ist es problematisch, Hunderte von automatisierten Tests und die parallele Remote-Ausführung durchzuführen. Sobald Sie über eine Reihe automatisierter Regressionstests verfügen, können Sie diese im Rahmen eines täglichen automatisierten Regressionstests in mehrere Gruppen von Geschäftsmodulen aufteilen und parallel ausführen. Die meisten dieser Testsuiten werden auf einer virtuellen Remote-Maschine ausgeführt, und die Testergebnisse sind erst verfügbar, nachdem sie ausgeführt wurden. Andernfalls können Sie in die Jenkins-Konsole schauen, um die Protokolle des Testausführungsprozesses anzuzeigen. Das ist manchmal nervig. Es wäre großartig, eine Anwendung zu haben, die Informationen zum Bestehen des Tests liefert, während sie auf virtuellen Remote-Maschinen ausgeführt werden.

Lassen Sie uns sehen, wie Sie mit InfluxDB und Grafana eine einfache Seite mit Testergebnissen und einem Dashboard erstellen können.

Zweck:


Wir werden alle verfügbaren Testmetriken sammeln, wie zum Beispiel:

  • Status der Testmethode
  • Dauer der Testmethode
  • Klassenstatus mit Testmethoden
  • Testlaufzeit für eine Klasse
  • Test Suite Status
  • Testlaufdauer


Wir können einige der Indikatoren in Echtzeit abrufen, wie unten gezeigt:

  • Die Anzahl der Testmethoden, gruppiert nach Status (z. B. Bestanden: 30, Fehlgeschlagen: 2, Übersprungen: 2) an einem bestimmten Tag.
  • Der Trend in der Dauer einer Reihe von Tests für eine Woche, einen Monat, ein Jahr usw.


InfluxDB:


InfluxDB ist eine Zeitreihendatenbank, mit der alle Testmetriken erfasst werden. InfluxDB verfügt über eine REST-API zum Schreiben von Daten und Senden von Anforderungen. Hier können Sie mehr erfahren. Unten verwende ich den Docker-Befehl, um eine Instanz von InfluxDB zu starten.

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


Datenbank erstellen:


Wir haben die InfluxDB-Datenbank bereits erstellt und gestartet. Erstellen wir ein separates Datenbankschema zum Sammeln von Selenium-Testergebnissen. Unten führe ich einen Befehl im Terminal aus, um ein Schema namens "Selen" in der Datenbank zu erstellen. (Überprüfen Sie die URL und ersetzen Sie localhost durch Hostname / IP-Adresse, wenn Sie nicht auf dem aktuellen Computer ausgeführt werden.)

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


TestNG:


Lassen Sie uns einen einfachen testNG-Test erstellen:

 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(){ } } 


Unser Ziel ist es, zur Laufzeit Testergebnisse in InfluxDB zu sammeln. Wir brauchen also einen Treiber / eine Bibliothek in Java für InfluxDB.

Maven-Abhängigkeiten:


Fügen Sie die unten gezeigten Maven-Abhängigkeiten hinzu:

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


Studenten:


TestNG-Listener eignen sich hervorragend zum Abhören von Ereignissen und können je nach dem, was passiert ist, reagieren. Lassen Sie uns zunächst eine einfache Klasse erstellen, die für das Senden der Ergebnisse an InfluxDB verantwortlich ist.

 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); } } 


Erstellen Sie nun eine weitere Klasse, die die ITestListener-Schnittstelle implementiert.

 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); } } 


Hinweis: Verwenden Sie ein optionales Tag, das Ihren Zielen im obigen Beispiel entspricht, um die Ergebnisse zu klassifizieren. Zum Beispiel Tag ("Szenario", "Anmeldefluss").

Der Listener aus dem obigen Beispiel überwacht die Ausführung des Tests und sendet, sobald eine bestimmte Methode / Klasse des Tests abgeschlossen ist, den Namen, die Dauer und einige zusätzliche Details. Mein Ziel hier ist es nur, Ihnen eine Idee zu geben. Ändern Sie den Code entsprechend Ihren Anforderungen.

Fügen Sie nun den Listener zum XML-Paket oder zur TestNG-Basisklasse hinzu.

 <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> 


Oder sonst:

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


Grafana:


Wir haben es geschafft, die Ergebnisse an InfluxDB zu senden. Aber wie kann man Ergebnisse anfordern und die empfangenen Daten visualisieren? Dafür werden wir ein anderes kostenloses Tool namens "Grafana" verwenden.
Grafana ist ein hervorragendes Visualisierungswerkzeug für Zeitreihendaten und interagiert perfekt mit InfluxDB. Im Folgenden finden Sie Docker-Befehle zum Erstellen einer Instanz von Grafana. [Das Piechart-Plugin ist im Team optional. Es kann entfernt werden, wenn es nicht benötigt wird.]

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


Datenquelle für Grafana:


Gehen Sie zu Einstellungen -> Datenquellen -> Neue Datenquelle hinzufügen , wie im Screenshot gezeigt. Klicken Sie auf die Schaltfläche 'Speichern & Testen', um sicherzustellen, dass Grafana mit InfluxDB kommunizieren kann.
Hinweis: Wenn Sie Grafana mit Docker verwenden und versuchen, als "Server-Standard" zuzugreifen, verwenden Sie NICHT localhost in der InfluxDB-Verbindungszeichenfolge. Das liegt daran, dass localhost hier ein Grafana-Container ist, keine physische Maschine. Daher kann der Grafana-Container InfluxDB nicht finden.




Erstellen eines Dashboards:


Ich möchte, dass Sie sich dieses Video ansehen, da es nicht einfach ist, alle Nuancen im Artikel zu erklären. Deshalb habe ich ein Hotelvideo aufgenommen.



Demo 2:


Zusammenfassend:


Ich hoffe, dass es sich als interessant und nützlich herausgestellt hat, mit InfluxDB und Grafana Echtzeitergebnisse zu erzielen. Es erfordert minimale Änderungen in der vorhandenen Struktur, da wir TestNG-Listener verwenden. Das Entfernen des Listeners aus der Set- / Basisklassendatei reicht aus, um diese Funktion zu deaktivieren, wenn Sie sie nicht benötigen. Dieser Ansatz hilft, Frustrationen im Team zu vermeiden, wenn seine Mitglieder die Testergebnisse nur über Konsolen-E / A auf einem Remotecomputer überwachen. Dieser Artikel beschreibt nur die Hauptidee. Sie können diesen Ansatz verbessern, indem Sie weitere Informationen hinzufügen, z. B. eine Testumgebung, zusätzliche Filter hinzufügen, um die Daten in Diagrammen für eine bestimmte Umgebung / bestimmte Tests usw. zu aktualisieren.

Hier ist so ein kurzes, aber sehr nützliches Material. Traditionell warten wir auf Ihre Kommentare und erinnern uns, dass heute ein Tag der offenen Tür zu dem Preis ist, für den sich jeder anmelden kann.

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


All Articles