Automatische Generierung von k6 Lasttests im dqualizer

Lasttests sind eine effektive Möglichkeit die Performance von Anwendungen zu überprüfen. Wobei gute Performance bei heutiger Software essentiell für eine bestmögliche Nutzererfahrung ist. Beim Testen gibt es jedoch eine Vielzahl von Szenarien, welche durchgegangen werden können. Um dieses Verfahren zu vereinfachen, habe ich mit Hilfe des Lasttest-Tools k6 einen Runner implementiert, welcher Testskripte automatisch generieren kann und die Ergebnisse an eine Zeitseriendatenbank exportiert.

, Schander Eduard

In der Geschäftswelt des heutigen World Wide Web sind bereits Millisekunden entscheidend. Beispielsweise entdeckte Amazon, dass ihr Umsatz bei einer höheren Antwortzeit von nur 100 ms bereits um 1 % abnimmt. Auch Google fand heraus, dass ihre Suchanfragen um 20 % sinken, sobald die Suche 500 ms länger benötigt als üblich. Performance spielt somit bei Software eine sehr wichtige Rolle. Denn jeder kennt das Sprichwort: Zeit ist Geld.

k6 Lasttests blog image

Performance Testing beschäftigt sich mit genau diesem Thema: Versichern, dass die Performance zufriedenstellend ist. Wie bei allen Testverfahren geht es hierbei darum Schwächen ausfindig zu machen und zu überprüfen, ob die gewünschten Anforderungen erfüllt werden. Dabei stehen vor allem nicht-funktionale Anforderungen wie Geschwindigkeit, Stabilität oder Skalierbarkeit im Vordergrund. Die Formulierung Performance-Test dient eher als ein Oberbegriff für verschiedene Testarten. Es gibt beispielsweise Stresstests, Soak-Tests oder auch Lasttests. Ich fokussiere mich in diesem Artikel auf Lasttests, wobei die verschiedenen Testarten alle eine hohe Ähnlichkeit aufweisen.

Was genau sind Lasttests?

Lasttests sollen das Nutzerverhalten nachahmen, indem eine festgelegte Menge von Anfragen an das zu testende System gesendet wird. Die Anfragen werden dabei von virtuellen Usern erzeugt, welche durch Threads simuliert werden. Die Menge an Usern, welche in einem Test erzeugt werden, wird dann Last genannt. Ziel ist es eine Anwendung unter möglichst realen Umständen zu überprüfen. Vor allem nicht-funktionale Anforderungen wie Geschwindigkeit und Stabilität stehen dabei im Fokus. Bei Lasttests wird davon ausgegangen, dass sich die simulierte Last innerhalb eines typischen Bereichs befindet. Die Last sollte also etwa der täglichen Auslastung des Systems ähneln.

Überschreitet die Last den typischen Bereich, spricht man von Stresstests. Diese sollen gezielt Fehler verursachen und konzentrieren sich somit vor allem darauf Verfügbarkeit und Robustheit der Anwendung zu prüfen.

Das Ergebnis eines Lasttests sind Metriken wie Antwortzeit, Fehlerrate oder Datenmengen. Um Tests durchzuführen, stehen einige Tools zur Verfügung, wie zum Beispiel JMeter, LoadRunner oder seit 2017 auch k6.

Was ist k6?

k6 ist ein Open-Source Performance-Testing-Tool, welches neben Lasttests auch andere Performance-Tests ermöglicht. Das Tool wurde vor allem für Software-Developer entworfen. Dies kann ich nur bestätigen. Als Junior-Entwickler mit wenig Erfahrung in Lasttests konnte ich mich sehr schnell in das Tool einarbeiten. Die Testskripte selbst werden in JavaScript geschrieben. Für die Ausführung übersetzt k6 das Skript zuvor in die Programmiersprache Go und startet dann den Lasttest. Da Go zu einer der schnellsten Programmiersprachen gehört, macht das k6 ebenfalls zu einem sehr performanten Lasttest-Tool.

Alle Testskripte haben einen einfachen Grundaufbau: Zuerst wird der Test initialisiert. Beispielsweise werden Dateien geöffnet, Variablen erstellt oder der Test wird genauer konfiguriert.
Anschließend wird eine Funktion definiert, welche von allen simulierten Usern ausgeführt wird. Optional kann auch eine setUp- oder tearDown-Funktion definiert werden. Also Funktionen, welche vor dem Starten und dem Herunterfahren des Lasttests ausgeführt werden.

Screenshot simpleK6
Ein einfaches k6-Skript

Ein Bespielskript ist oben zusehen. In der Variable options wird die Testkonfiguration eingegeben. Hier sollen 10 virtuelle User 4 Sekunden lang Anfragen versenden. Darunter wird die Funktion für die virtuellen User definiert, in welcher eine GET-Anfrage versendet wird. Anschließend wird geprüft, ob der zurückgegebene Statuscode 200 entspricht. Solche Prüfungen werden in k6 checks genannt. In den Ergebnismetriken lässt sich einsehen welche checks zutrafen und welche nicht.

Mit checks ist es jedoch nicht möglich einen Test abbrechen zu lassen. Dafür müssen in der Konfiguration Schwellenwerte, sogenannte thresholds, angegeben werden. Sobald ein solcher Wert überschritten wird, gibt der Test einen Exit-Code ungleich Null zurück, wodurch auch andere Tools erfahren können, dass der Test fehlgeschlagen ist. Dies ermöglicht k6 die Integration mit einigen CI/CD-Tools wie GitLab oder Jenkins. Die Ergebnisse eines Lasttests können zum Schluss in eine Datei geschrieben oder an externe Services wie die Zeitreihendatenbank InfluxDB oder das Visualisierungstool Grafana gesendet werden.

Automatische Skriptgenerierung

Damit k6 in größere Testing-Tools eingebunden werden kann, ist eine automatische Generierung von Testskripten notwendig. Da es noch keine Anwendungen gibt, die selbstständig JavaScript programmieren können, stelle ich meine Implementierung des Configuration-Runners vor, welcher automatisch Testskripte erzeugen kann. Ebenso exportiert dieser die Ergebnismetriken an externe Services weiter. Den Runner habe ich mit Hilfe von Spring Boot implementiert. Der Source-Code ist öffentlich und lässt sich hier im Git-Repository einsehen.

Die Idee dahinter ist, dass mit Hilfe einer JSONKonfiguration ein Testskript automatisch erstellt werden soll. Die Konfiguration soll dabei einer festen Syntax folgen. Nachdem die Konfiguration in ein Skript umgewandelt wurde, wird dieses ausgeführt und die Testergebnisse in einer Datei abgespeichert. Ein Beispiel für eine Skriptgenerierung ist unten dargestellt.

OverviewCR
Übersetzung einer Konfiguration in ein Testskript

Wie handhabe ich die Ergebnisse von Lasttests?

Um die Ergebnismetriken, die der ausgeführte Lasttest zurückmeldet, einfach weiterverarbeiten zu können, sollten diese in einer Zeitseriendatenbank abgespeichert werden. Dazu exportiert der Configuration-Runner die Metriken zuerst an einen OpenTelemetry-Collector. Dieser Collector ist ein Hilfswerkzeug, welcher den Empfang, die Verarbeitung und den Export von Daten erleichtert. Anschließend werden die Metriken an eine InfluxDB weitergesendet. Von dort können die Ergebnisse beispielsweise mittels Grafana visualisiert werden.

Screenshot Grafana
Eine Beispielvisualisierung von Metriken in Grafana

Automatische Testgenerierung im Projekt dqualizer

Der implementierte Configuration-Runner soll als Proof of Concept für das dqualizer-Forschungsprojekt dienen. Das Projekt wird von der Novatec Consulting GmbH in Zusammenarbeit mit der Universität Hamburg durchgeführt und vom Bundesministerium für Bildung und Forschung gefördert. Ziel ist die Entwicklung eines Open-Source Tools für domänenzentrierte Laufzeitanalysen. Das Erstellen solcher Analysen soll vor allem für Fachexperten:innen ohne umfangreiche technische Kenntnisse erleichtert werden.
Beispielsweise möchte ein Mitarbeiter im Versicherungsbereich wissen wie viele Versicherungen im letzten Monat abgeschlossen wurden. Diese fachliche Fragestellung wird in eine technische Fragestellung umgewandelt. Zum Beispiel wie oft wurde die Funktion takeOutInsurance() aufgerufen. Die Ergebnisse einer technischen Analyse werden zum Schluss wieder in eine fachliche Antwort übersetzt.

Weitere Informationen zum Projekt befinden sich hier.

Fazit

Lasttests sind ein effektives Verfahren um nicht-funktionale Anforderungen wie Geschwindigkeit oder Stabilität zu überprüfen. Dabei erweist sich k6 als ein nützliches Tool, welches aus meinen Erfahrungen von Software-Developern schnell verstanden und angewendet werden kann. Die Nutzung von k6 – auch in Kombination mit anderen Tools – ist somit mühelos möglich. Durch die automatische Generierung von Testskripten lassen sich Lasttests komfortabel in größere Test-Architekturen einbinden, wobei als Input lediglich eine Konfigurationsdatei benötigt wird. Der Output kann in Form von Ergebnismetriken leicht in eine Zeitseriendatenbank exportiert werden, wo diese weiterverarbeitet werden können. Beispielsweise ist es möglich, wie im dqualizer-Forschungsprojekt, die exportierten Metriken zu analysieren und in fachliche Metriken umzuwandeln, welche wiederum Fachkräften ermöglichen auf diese zu reagieren.

Allgemeine Anfrage

Wir freuen uns darauf, Ihre Herausforderungen zusammen in Angriff zu nehmen und über passende Lösungsansätze zu sprechen. Kontaktieren Sie uns – und erhalten Sie maßgeschneiderte Lösungen für Ihr Unternehmen. Wir freuen uns auf Ihre Kontaktanfrage!

Jetzt Kontakt aufnehmen