Einstieg in den Lasttest und Performancetest mit Locust

🕒 Lesedauer: 2 Minuten

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:

 

Image
lasttest-locust-01.png

 

Bild: Locust. (Klicken zum Vergrößern)

Locust starten mit locust im Verzeichnis der Datei locustfile.

 

Image
lasttest-locust-02 (1).png

 

Bild: Locust in der Kommandozeile starten. (Klicken zum Vergrößern)

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

 

Image
lasttest-locust-03.png

 

Bild: Locust - Startseite mit Konfiguration. (Klicken zum Vergrößern)

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

 

Image
lasttest-locust-04.png

 

Bild: Locust - Testkonsole. (Klicken zum Vergrößern)

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

 

Image
lasttest-locust-05.png

 

Bild: Locust - Auswertung, Tab “Statistics” . (Klicken zum Vergrößern)

Weitere Tabs sind vorhanden, hier z.B. die Charts:

 

Image
lasttest-locust-06.png

 

Bild: Locust - Auswertung, Tab “Statistics” . (Klicken zum Vergrößern)

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:

 

Image
lasttest-locust-07.png

 

Bild: Locust - Status Code”. (Klicken zum Vergrößern)

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.

 

Veröffentlicht am 20.September 2023

Aktualisiert am 09.September 2024

Jürgen Eube

Test Analyst und Testautomatisierer

Jürgen Eube ist seit über 30 Jahren in der IT tätig, in den letzten 10 Jahren mit dem Schwerpunkt Testing. Aus Projekten in den Bereichen Finanzen, Telekommunikation, Verzeichnisdienste, Transportwesen u.v.m. kennt er sowohl die Seite der Entwicklung als auch die des Testers. Gerne übernimmt er die Funktion des Brückenbauers zwischen diesen Welten und verliert dabei nicht seinen kritischen Blick. Bei Qytera war er als Last- und Performancetester tätig.

Finden Sie weitere interessante Artikel zum Thema: