Einstieg in den Lasttest und Performancetest mit Locust

Vielleicht haben Sie bereits Last- und Performancetests mit einem der “großen” Tools wie JMeter realisiert, haben sich durch umfangreiche GUIs gekämpft, haben über hohen Ressourcenverbrauch gestaunt oder haben sich bei speziellen Testanforderungen über unkomfortables Scripting geärgert? Vielleicht haben Sie sich gedacht, da wäre es naheliegend, besser gleich den Test komplett als Code zu implementieren?
Einen solchen Ansatz verfolgt Locust. Locust ist ein Werkzeug zur Realisierung von Last- und Performancetests in Python Code. Im Folgenden ist der Einstieg in Locust für den Last- und Performancetest einer Web-Anwendung beispielhaft beschrieben.
Locust - Lizenz und Installation
Locust liegt als Open Source unter der MIT Lizenz vor. Vorausgesetzt wird die Programmiersprache Python und ein C++ Compiler (Windows: z. B. Microsoft C++ Build Tools). Zur Installation siehe https://docs.locust.io/en/stable/installation.html.
Hello World, einfacher Seitenaufruf mit Locust
Zum Einstieg sei hier in Kurzform der Test einer Website beschrieben.
Datei locustfile.py mit folgendem Inhalt erzeugen:

Locust starten mit locust im Verzeichnis der Datei locustfile.py:

Es wird ein lokaler Webserver gestartet. Aufruf localhost:8089 im Browser:

In “Number of users” ist die Anzahl der zu startenden Benutzer einzutragen, jeder Benutzer führt die Tasks der oben angegebenen Klasse (abgeleitet von HttpUser) in einer Schleife aus. Mit der “Spawn rate” läßt sich das Startverhalten konfigurieren (Ramp Up). Im Feld Host ist die gewünschte URL einzugeben, hier: http://selenium.webtesting.eu .
Achtung: “http” muss enthalten sein.
Test starten mit “Start swarming”:

Die Testkonsole mit laufendem Test erscheint. Der Test wird endlos ausgeführt bis zum Klicken auf “STOP”. Nach dem Stoppen wird die Statistikseite angezeigt:


Der lokale Webserver wird wieder gestoppt durch Eingabe von STRG-c in der Eingabeaufforderung. Locust bietet also sowohl eine Konsole zur Beobachtung des laufenden Tests als auch eine vorgefertigte Auswertung des Tests “out of the box” an. Damit können schnell einfache Last- und Performancetests durchgeführt werden.
Scripting - Locust
Locust stellt die Klasse HttpUser bereit, welche die Erstellung eines Testskripts mit HTTP-Aufrufen unterstützt. Dabei werden Tasks definiert, deren Ausführung gewichtet werden kann (siehe einfaches Beispiel oben).
Die HTTP-Requests (GET, POST, DELETE, etc.) werden mit der Python Library "requests" von Kenneth Reitz codiert Requests: HTTP for Humans™ — Requests 2.27.1 documentation .
Zunächst sollten die zu skriptenden Aufrufe mit den Entwickler-Werkzeugen eines Browsers analysiert werden. Hier finden sich Adressen, Parameter, Daten, Cookies, etc..
Die Arbeit des Skriptens eines Use Cases besteht im Kern daraus, eine Folge von Requests mit der Auswertung der zugehörigen Responses zu programmieren. Die Klassen request.requests und request.response stellen dabei eine Vielzahl von Parametern wie url, params, data, cookies, etc. bereit. Die Extraktion von wiederzuverwendenden Parametern wie SessionIDs und Verifikation von Ergebnissen geschieht mit Python-Mitteln, z.B. mit der Verwendung von Regular Expressions.
Hier die Ergänzung des obigen Beispiels mit der Zuweisung des Abfrage-Ergebnisses in die Variable “response” mit Ausgabe des Status Codes und des Ergebnis-Texts, zusätzlich wurde eine wait-Funktion hinzugefügt:

Im Vergleich etwa zum Einsatz von JMeter gibt es hier also keine Unterstützung wie die Cookie- oder Header-Manager was aber für einen geübten Python-Programmierer kein Nachteil sein muss. Auch gibt es keinen Viewer zum Anschauen einer Response, es gilt etwa eine HTML-Seite erstmal in ein Logfile zu schreiben. Wer schon mal versucht hat, spezielles Verhalten in JMeter zu programmieren (Groovy), der wird die klare Struktur eines Python-Programms zu schätzen wissen.
Ausblick
Das Verhalten eines Users kann natürlich auch durch mehrere Tasks formuliert werden, auch mit unterschiedlicher Wichtung. Es gibt noch allerhand Hilfen wie z.B. on_start- und on_stop-Methoden usw. Die Testausführung auf verteilten Lastgeneratoren wird unterstützt. Die Statistikdaten können im CSV-Format geschrieben werden und stehen dann zu einer individuellen Auswertung bereit.
Fazit
Die Implementierung eines Last- und Performancetests in Code bietet größtmögliche Flexibilität. Falls schon mit Python entwickelt wird entstehen hier Synergien. Eine Quellcodeverwaltung wie Git kann problemlos genutzt werden. Locust ist ein schlankes Werkzeug mit geringem Ressourcenbedarf. Ein geübter Entwickler, der die zu testende Anwendung kennt, kann hier ein nahezu beliebiges Verhalten nachbauen. Komfortabel ist das nicht unbedingt. Es bleibt die persönliche Entscheidung, ob es besser passt, mit einer Entwicklungsumgebung zu codieren oder doch ein anderes Tool mit umfangreicher Benutzeroberfläche zu benutzen.
Über den Autor
