Testlauf-Vergleich von Last & Performance-Tests mit JMeter

🕒 Lesedauer: 7 Minuten

Zu Beginn eines Last & Performance-Test Projektes wird noch wenig über die spätere Ergebnisauswertung gesprochen, meist ist dies noch zu abstrakt und undefiniert für alle Beteiligten. In den ersten Versuchen das JMeter Scripting zu implementieren, wird noch stark auf die Funktionalität geachtet. Aber je öfter ein Testlauf durchgeführt wird, vielleicht sogar in einer CI/CD-Umgebung, desto mehr erhalte ich den Wunsch als Lasttester:in, unterschiedliche Läufe miteinander zu vergleichen. Denn im Projektverlauf müssen immer wieder Fragestellungen wie “wurde durch die Code-Änderung eine Performance-Verbesserung herbeigeführt” oder “gehen die neuen Features zu Lasten der Geschwindigkeit” beantwortet werden.

Wieso bestehende Reports hier nicht weiterhelfen!

Natürlich wurde auch bei meiner Entwicklung der Last & Performance-Tests an das Reporting gedacht. So ist es möglich in unterschiedlichen Metriken oder Graphen die unterschiedlichen Requests und den dazugehörenden Response zu analysieren und zu interpretieren. Für ganze Testpläne lassen sich anschauliche Aggregationen und einiges mehr an Reports anzeigen. Aber immer nur zu dem gerade ausgeführten Testlauf bietet hier JMeter unterschiedliche Listener oder den HTML-Report. Schwieriger wird es schon einen Testlauf zu analysieren, der vor ein paar Wochen ausgeführt wurde. Es gibt hier zwar Importmöglichkeiten der JTL-Protokoll-Daten für die verschiedenen JMeter Listener, welche unterschiedliche Graphen, Tabellen und Aggregationen zur Verfügung stellen. Es gibt irgendwie keine Darstellung, die zwei Testläufe miteinander vergleicht. Auch der Standard HTML-Report aus JMeter bietet keine Lösung für einen Testlaufvergleich.

 

Image
hits-per-second.png

Bild: Hits per Second Graph des JMeter HTML-Reports. (Klicken zum Vergrößern) [Quelle: Qytera]

 

Timeseries Datenbanken und deren Komplexität

Nun ging ich auf die Suche nach Alternativen. Ich stöberte im Web und fand immer wieder Artikel, die beschrieben, wie gut JMeter über Timeseries Datenbanken ausgewertet werden kann. Die dazu notwendigen Listener waren mir für die InfluxDB und Prometheus Integrationen bekannt, denn damit hatte ich schon Umsetzungen für Lasttest-”Live-Views” vorgenommen. Aber ein Vergleich von mehreren Läufen von unterschiedlichen Zeiträumen war mir bis dato unbekannt und auch weiterführende Web-Suchen nach einem Lösungsansatz verliefen sich in wirren Forums-Diskussionen. Also setzte ich mich selbst daran, die Daten auszuwerten. Da ich InfluxDB 2.x schon im Einsatz hatte, war es mir naheliegend diese anzubinden. Nun schrieb ich ein Testplan mit unterschiedlichen HTTP-Requests mit zufälligen Fehlern und ließ die Tests mehrmals laufen, um eine Grundlage für meine Auswertungen in InfluxDB zu bekommen. Als nächstes erstellte ich Abfragen mittels Flux und InfluxQL, musste aber feststellen, dass ich mit meinen wenigen SQL Kenntnissen an der Ablagestruktur von Timeseries Datenbank schnell an meine Grenzen stieß. Ich fand mich in Joins und Derivativen wieder, aber alles kam nicht annähernd an das gewünschte Ergebnis eines Testlaufvergleiches. Irgendwie wollten sich die Testläufe nicht übereinandergelegt darstellen lassen. Der inzwischen erfolgte Schwenk zu Grafana, mit der m.E. leichteren Datenaufbereitung in den Dashboard Panels, führte mich nicht weiter. Irgendwann fand ich als kleinen Hoffnungsschimmer ein Grafana PlugIn Compare Queries, das mich fast ans Ziel brachte. Ich konnte damit Graphen übereinanderlegen, aber den dafür benötigten Timeshift, also den Versatz, den ein zweiter Graph auf der Zeitachse erhalten soll, konnte ich nicht dynamisch/variabel auf die selektierten Daten anwenden. Nun gab ich auf, da ich auf eine für mich leichtere Lösung gestoßen war. Beispielhaft habe ich im Folgenden einen Graphen mittels Compare Queries erstellt.

 

Image
average-response-time.png

Bild: Grafana PlugIn Compare Queries. (Klicken zum Vergrößern) [Quelle: Qytera]

 

JtlReporter - eine Lösung mit Charme

Bei meinen Recherchen zu dem Thema Testlauf-Vergleich bin ich irgendwann auf Ludêk Novýs JtlReporter gestoßen (wird unter MIT-License zur Verfügung gestellt). Dieses Tool sollte mir eine Testlauf-Vergleichsmöglichkeit bieten, indem ich einfach meine JMeter JTL-Dateien in dieses Tool importiere und daraus aufbereitete Graphen erhalte. Aber zuerst war ich abgeschreckt, denn die Installation sollte über Docker Compose erfolgen. Hier dachte ich anfänglich, ob dies nicht zu komplex wird. Die Neugier war aber größer. So installierte ich Docker Desktop und Compose auf meinen PC, klonte das Github Repository und legte mit docker-compose los. Die Umgebung war in wenigen Augenblicken hochgefahren und verfügbar. Das Login über Webbrowser stand auch gleich zur Verfügung und was sehr lobenswert war, ist die sehr ausführliche Beschreibung dieses Tools, z.B. des Imports von jtl-Dateien. Ich hatte in wenigen Schritten meine Einstellungen vorgenommen, meine Daten importiert bekommen und gleich ein paar gute und aussagekräftige Auswertungen erzeugt.

 

Image
scenario-trends.png
Bild: JtlReporter Scenario Trends (Klicken zum Vergrößern) [Quelle: Qytera]


 

Ich erhielt allgemeine Graphen wie den Szenario Trend oder Throuput-Graphen, aber es lassen sich Baselines ziehen und daraufhin bis auf Einzelrequests die Daten aus den einzelnen Läufen vergleichen.

 

Image
einzelrequests.png

Bild: Vergleich Einzelrequests (Klicken zum Vergrößern) [Quelle: Qytera]

 

Ganz besonders ist hervorzuheben, dass die gewählte Architektur in die Cloud übertragen werden kann, so dass ich den JTLReporter sogar in Azure oder AWS laufen lassen kann. Darüber hinaus können die Daten direkt aus den JMeter Testläufen über eine API weggeschrieben werden.

HTML-Report bietet doch einen Merge!

Oben schrieb ich, dass der Standard HTML-Report keinen Testlaufvergleich zulässt. Sehr wohl gibt es das JMeter Merge PlugIn bzw. gibt es händische Merge-Möglichkeiten um JTL-Dateien zusammenzuführen. Damit sind Testlaufvergleiche innerhalb des HTML-Reports darstellbar. Ich persönlich finde die graphische Darstellung des HTML-Reports als unzeitgemäß, somit wollte ich nicht darauf aufbauen.

Kuriose Lösung mit Blazemeter

Da es während meiner Recherchen mir irgendwann zu viel wurde eine Lösung selbst zu entwickeln, bin ich auch bei Blazemeter gelandet, das für mich eine der kuriosesten Möglichkeiten bot. Denn Blazemeter bietet für Anwender mit einem Kundenlogin einen Listener für die eigene JMeter Installation an, der die Ergebnisse nach Blazemeter schreibt. Dort kann über den in Blazemeter vorhandenen Testlaufvergleich eine Auswertung vorgenommen werden.

 

Image
response-time.png
Bild: Blazemeter Test Run Comparison (Klicken zum Vergrößern) [Quelle: Qytera]


 

Zusammenfassung

Ich war verwundert, wie wenig vorgefertigte Lösungen für einen Testlaufvergleich mit JMeter existieren. Meist bieten Cloud-Lösungsanbieter wie Blazemeter, Octoperf & Co. solche Funktionalitäten, aber meist nur für ihre zahlende Kundschaft. Lediglich die Lösung mit dem JtlReporter brachte mir eine einfach zu installierende Lösung, solange man sich an Docker wagt. Die Funktionalität ist zwar einfach gehalten, bietet aber alle notwendigen Auswertungen, sogar auf Einzelrequests. Und nicht nur für Anwender von JMeter kann es interessant sein, denn es bietet auch Schnittstellen oder Importmöglichkeiten für Locust und Taurus.

 

Image
5

Veröffentlicht am 28.September 2021

Aktualisiert am 09.September 2024

Moritz Salein

Senior Testmanager und Test Automation Engineer

Moritz Salein ist seit über 20 Jahren in der IT tätig, aber vor über 10 Jahren begann seine Passion des Softwaretestens. Seit dieser Zeit übernahm er immer mehr Aufgaben die im Softwaretest, Testmanagement und auch ganz speziell in der Testautomatisierung anfallen. Dadurch war er in den unterschiedlichsten, meist international aufgestellten Unternehmen und Projekten beschäftigt. Auch in der agilen Softwareentwicklung fand er großen Gefallen, so dass er schon seit über 8 Jahren Erfahrungen mit verschiedensten Vorgehensweisen, wie Scrum, Kanban oder SAFe sammeln konnte. Er war als Senior Testmanager und Test Automation Engineer bei Qytera tätig.

Finden Sie weitere interessante Artikel zum Thema: