Abstract
Die Verschlechterung der Performance einer Webanwendung kann sich sowohl auf das aktuelle als auch auf das zukünftige Verhalten von Nutzer negativ auswirken. Dies wurde in der Vergangenheit in zahlreichen Studien und Experimenten nachgewiesen. Daher ist es notwendig, zusätzlich zu den funktionalen Tests auch nicht-funktionale Tests wie Lasttests durchzuführen, um die Qualität einer Webanwendung zu gewährleisten. Eine bedeutende Rolle in der Qualitätssicherung stellt das frühzeitige Erkennen von Performance Regression dar. In Zukunft soll die Qualitätssicherung der Webanwendung von einem Unternehmen über automatisierte, tägliche Performance Regressions Tests mit einem Lasttest Tool verbessert werden.
Diese Arbeit ordnet die Themen Lasttest und Performance Regression in den Bereich des nicht-funktionalen Testens ein. Insbesondere gibt sie einen tieferen Einblick in verschiedene Methoden und Vorgehensweisen der drei wichtigsten Phasen eines Lasttests: Design der Lasten, Durchführung des Lasttests und Analyse der Ergebnisse. Eine ausgiebige Marktanalyse bewertet 26 ausgewählte Lasttest Tools unter verschiedenen Themengebieten und verschafft ein Überblick über die aktuellen Funktionen von Lasttest Tool. Die 26 Lasttest Tools umfassen ein breites Spektrum an Lösungsansätze, von kleinen Frameworks und Open Source Programmen über proprietäre, cloudbasierte Angebote bis hin zu firmeninternen Lasttest Tools. Ein Großteil der Marktanalyse ist öffentlich über GitHub einsehbar und kann als erste Orientierung für die eigene Recherche dienen.
In Absprache mit einem externen Industriepartner wird ein firmeninternes Lasttest Tool für die Realisierung automatisierter Performance Regressions Tests eingesetzt. Auf Basis der gewonnenen Erkenntnisse wird ein Konzept einwickelt und implementiert. Dieses Konzept erweitert das Lasttest Tool um ein optionales Modul für die Performance Regressions Analyse. Im Anschluss bewertet eine ausgiebige Evaluation das implementierte Konzept unter Verwendung einer Testumgebung. Anhand von vielseitigen Szenarien wird gezeigt, dass die implementierte Performance Regressions Analyse eine erste einsetzbare Problemlösung darstellt.
Ausgangslage und Forschungsfrage
Wer eine Webanwendung kontinuierlich weiterentwickelt, kennt das Problem: Funktional ist alles grün, aber die Antwortzeiten werden schleichend schlechter. Solche Performance-Regressionen fallen oft erst auf, wenn Nutzer bereits betroffen sind.
Warum das relevant ist, zeigen Untersuchungen sehr konkret: In Experimenten wurden bei künstlich hinzugefügten Verzögerungen (z. B. 400 ms) messbare Änderungen im Nutzungsverhalten beobachtet. [1] [2] Auch eine Verlangsamung im Bereich von 100 ms kann bereits spürbar sein, und längere Ladezeiten erhöhen die Wahrscheinlichkeit, dass Nutzer abbrechen. [3]
Genau deshalb ist Performance-Qualitätssicherung mehr als ein einzelner Lasttest kurz vor dem Go-live. In der Praxis entstehen Regressionen oft durch kleine Änderungen an scheinbar harmlosen Stellen: ein neues Logging, ein zusätzlicher Call, ein ungünstiger Cache-Miss. Wenn Releases häufig sind, ist es im Nachhinein schwer zu rekonstruieren, ab wann die Performance wirklich gekippt ist.
Die Arbeit, auf der dieser Beitrag basiert, setzt genau hier an. Sie fragt nicht nur: "Wie misst man Performance?" Sondern vor allem: Wie schafft man einen Ablauf, der regelmäßig läuft, Vergleichbarkeit herstellt und früh warnt, wenn ein Release die Anwendung spürbar langsamer macht?
Im Kern geht es damit um zwei praktische Leitfragen:
- Wie lassen sich Lasttests so definieren, dass sie realistische Belastungen abbilden und gleichzeitig reproduzierbar bleiben?
- Wie kann man die Ergebnisse automatisiert vergleichen, um Performance-Regressionen zuverlässig zu erkennen, ohne unnötige Abhängigkeiten mitzubelasten?
Methodisches Vorgehen
Die Arbeit baut den Lösungsweg systematisch auf und verbindet Grundlagen, Tool-Vergleich und konkrete Umsetzung.
Zuerst werden Begriffe und Grundlagen geklärt: Was ist überhaupt ein Lasttest, welche nicht-funktionalen Anforderungen sind typisch, und ab wann spricht man von einer Performance-Regression? Wichtig ist dabei die Perspektive der Praxis: Nicht die maximale Belastung ist das Ziel, sondern ein stabiler, wiederholbarer Test, der über Releases hinweg aussagekräftig bleibt.
Inhaltlich orientiert sich der Lasttest dabei an drei Phasen, die in vielen Projekten ohnehin existieren, aber selten sauber getrennt betrachtet werden: [4]
- Design der Lasten (welche User-Pfade, welche Verteilung, welche Abbruchbedingungen?)
- Durchführung (Lasttreiber, Parallelität, Laufzeiten, Messung)
- Analyse (welche Metriken, welche Vergleiche, welche Alarme?)
Darauf aufbauend werden Anforderungen für einen automatisierten Workflow abgeleitet. Im Fokus stehen dabei:
- tägliche bzw. regelmäßige Ausführung unter vergleichbaren Bedingungen
- Messung relevanter Metriken (insbesondere Antwortzeiten) und klare Ergebnisaufbereitung
- automatische Alarmierung bei Verschlechterung
- Entkopplung bzw. Schutz externer Abhängigkeiten, die nicht mitgetestet werden dürfen
Als zweite Säule folgt eine Marktanalyse: 26 Lasttest-Tools werden entlang praxisnaher Fragen verglichen (Bedienbarkeit, Lastmodellierung, Protokollunterstützung, Reporting, Automatisierung). Das liefert eine Landkarte: Welche Features sind in modernen Tools Standard, und wo muss man typischerweise nachrüsten?
Der dritte Schritt ist die eigentliche Umsetzung: Ein bestehendes Lasttest-Tool wird um Bausteine erweitert, die für Regressionstests entscheidend sind.
Ein wichtiger Teil ist die Strukturierung des Szenarios. In der Arbeit wird der Lasttest nicht als "ein großer Block" gedacht, sondern als Abfolge klarer Steps. Zusätzlich werden unterschiedliche Request-Typen logisch gruppiert (LoadGroups), sodass sich Last gezielter verteilen und später auch differenzierter auswerten lässt.
Damit tägliche Tests realistisch bleiben, braucht es außerdem eine konsistente Datengrundlage. Die Arbeit arbeitet dafür mit einem Request-Datensatz, der repräsentative Requests enthält, und einem Loader, der diese Requests reproduzierbar in den Testlauf einspeist. So wird verhindert, dass sich Messwerte nur deshalb ändern, weil "heute andere Requests" im Test waren.
Für den produktiven Betrieb ist zudem entscheidend, welche Systeme überhaupt belastet werden dürfen. Die Arbeit adressiert das über Entkopplung: Abhängigkeiten, die nicht getroffen werden sollen, werden in der Testumgebung über Virtualisierung/Mocks abgefangen.
Die Regressionserkennung folgt einem pragmatischen Prinzip: Aktuelle Messwerte werden gegen einen Referenzlauf verglichen. Weil reale Systeme schwanken, arbeitet die Analyse mit Schwellwerten (Thresholds), um nicht bei jeder natürlichen Varianz Alarm zu schlagen.
Abschließend wird der Ansatz in einer Testumgebung evaluiert. Dabei wird unter anderem untersucht, wie stark Messungen ohne Codeänderungen variieren, wie groß Datensätze und Laufzeiten sein müssen, damit Ergebnisse stabil werden, und wie gut simulierte Regressionen erkannt werden.
Die gewonnenen Erkenntnisse
Die Evaluation liefert mehrere Punkte, die man direkt in eigene Regressionstests übersetzen kann.
Erstens: Ein einfacher Vergleich "aktueller Lauf vs. letzter Lauf" kann in der Praxis bereits funktionieren. Wenn eine Verschlechterung sprunghaft auftritt, lässt sie sich mit wenigen, gut gewählten Kennzahlen oft zuverlässig erkennen.
Zweitens: Schwellwerte sind nicht optional. Die Arbeit zeigt, dass Antwortzeiten selbst bei gleichen Versionen und ähnlichen Bedingungen spürbar schwanken können. Ohne Toleranzbereich wird aus "Regressionstest" schnell ein "Alarmgenerator". In der Umsetzung wird daher mit zwei Arten von Thresholds gearbeitet: einem für durchschnittliche Antwortzeiten und einem für die Ausführungszeit einzelner Steps.
In der Evaluation werden beispielhaft konkrete Größenordnungen diskutiert (z. B. ein Threshold im Bereich von einigen Dutzend Millisekunden für Antwortzeiten und ein fester Threshold für Step-Laufzeiten). Der Kernpunkt ist dabei nicht die eine magische Zahl, sondern die Vorgehensweise: Thresholds müssen aus realen Schwankungen abgeleitet und im Betrieb nachjustiert werden.
Ein weiteres Ergebnis ist die Rolle von Lastniveau und Parallelität: Für Regressionstests ist eine mittlere, repräsentative Last sinnvoller als ein reiner Stresstest. In der Arbeit wird als Beispiel eine Belastung im mittleren Tagesbereich diskutiert (z. B. um 500 Requests pro Sekunde), kombiniert mit einer genügend hohen Zahl paralleler Lasttreiber, um die Last stabil zu halten.
Drittens: Datenbasis und Szenario-Design sind der entscheidende Hebel für Vergleichbarkeit. Für Regressionstests reicht es nicht, nur eine Ziel-Last festzulegen. Wichtig sind:
- ein konsistenter Request-Datensatz, damit sich Runs nicht durch unterschiedliche Requests verfälschen
- ausreichende Laufzeiten je Step, damit sich Metriken stabilisieren
- eine Struktur, die unterschiedliche Request-Typen sauber verteilt und einzeln auswertbar macht
Viertens wird eine typische Schwäche sichtbar: Wenn nur eine einzelne Request-Art schlechter wird, kann das im Durchschnitt "untergehen". Dann muss die Verschlechterung sehr deutlich sein, bevor sie im Gesamtmittel auffällt. Genau deshalb ist eine feinere Analyse pro Request-Typ eine naheliegende nächste Ausbaustufe.
Fünftens zeigt die Evaluation, dass Regressionen nicht nur "passieren" müssen, um sie zu testen: Durch gezielte Simulation (z. B. künstliche Verzögerung) lässt sich prüfen, ob die Analyse überhaupt anschlägt, ob Reports verständlich sind und ob Alarmierungsschwellen sinnvoll gewählt wurden.
Auch die Marktanalyse liefert ein praktisches Fazit: Viele Tools können heute Last erzeugen, aber nicht jedes Tool unterstützt einen Workflow, der Ergebnisse langfristig vergleichbar macht (z. B. konsistentes Reporting, Speicherung und feingranulare Auswertungen). Genau diese "letzten Meter" sind für Regressionstests entscheidend.
In Summe zeigt die Arbeit: Mit gezielten Erweiterungen (Steps/LoadGroups, automatisierter Vergleich, Schwellwerte, Reporting) kann ein bestehendes Lasttest-Tool zu einem praktikablen Einstieg in regelmäßige Performance-Regression-Tests werden.
Was die Ergebnisse bedeuten
Ein zentraler Beitrag der Arbeit ist die Prozessorientierung: Nicht ein einzelnes Tool-Feature ist entscheidend, sondern ein Workflow, der regelmäßig läuft, reproduzierbar ist und Ergebnisse liefert, die Teams schnell einordnen können.
Die Grenzen sind aber genauso lehrreich wie die Erfolge.
Ein zentraler Punkt ist Aggregation: Durchschnittswerte sind bequem, aber sie können Probleme verstecken. Wenn sich eine Request-Art verschlechtert, eine andere sich verbessert und beides im Mittel „wegmittelt“, bleibt die Regression unentdeckt. Praktisch heißt das: Regressionstests sollten so früh wie möglich auf eine Granularität hin entwickelt werden, die zu den wichtigsten Use-Cases passt (z. B. pro Request-Typ oder pro Step).
Der zweite Punkt ist die Wahl der Referenz. "Letzter Lauf" ist gut für sprunghafte Änderungen, aber schlecht für langsames Driften. Wer langfristig stabile Performance will, braucht zusätzlich einen Vergleich gegen eine stabile Baseline aus größerem Zeitabstand.
Das lässt sich gut als zweistufiges Modell denken: Ein schneller Vergleich zum letzten Lauf für die tägliche "Release-Warnung" und ein regelmäßiger Vergleich gegen eine stabile Referenz (z. B. wöchentlich/monatlich), um schleichende Verschlechterungen aufzuspüren.
Drittens entscheidet die Testumgebung darüber, wie viel Vertrauen man in ein Ergebnis legen kann. Ein produktionsnaher Test liefert die beste Aussagekraft, ist aber organisatorisch und technisch anspruchsvoller. Ein Staging-System kann Hinweise geben, sollte aber nicht blind als Wahrheit interpretiert werden.
Als sinnvolle Weiterentwicklung skizziert die Arbeit zwei Richtungen, die gut zusammenpassen: feinere Metriken (pro Request-Art) und ein Zeitreihenblick auf die Ergebnisse, sodass Trends sichtbar werden und Alarme gezielter ausgelöst werden können.
Kernaussagen und Ausblick
Automatisierte Performance-Regression-Tests müssen nicht mit einer perfekten, komplexen Analyse starten. Schon ein sauber definierter, regelmäßig laufender Lasttest mit reproduzierbaren Szenarien und einem Metrikvergleich gegen eine Referenz kann spürbar helfen, Verschlechterungen früh zu erkennen.
Die Arbeit zeigt außerdem, worauf es in der Praxis wirklich ankommt: stabile Datengrundlagen, sinnvolle Schwellwerte und eine Teststruktur, die Vergleichbarkeit ermöglicht. Genau diese Grundlagen entscheiden darüber, ob Regressionstests verlässlich werden.
Als nächster Schritt bietet sich an, die Auswertung zu verfeinern (pro Request-Typ) und neben dem Vergleich zum letzten Lauf auch langfristige Baselines einzuführen. Damit werden nicht nur sprunghafte Regressionen sichtbar, sondern auch langsames Performance-Driften über Wochen.