Blog

Testen von GWT-Anwendungen auf Kapazität und Leistung

Mark Bakker

Aktualisiert Oktober 22, 2025
5 Minuten

In meiner derzeitigen Funktion als Spezialist für Anwendungsleistung sehe ich viele verschiedene Frameworks, die verwendet werden, um Anwendungen schneller zu entwickeln, eine reaktivere Frontend-Anwendung zu erstellen oder einfach nur ein Framework, das aus Sicht der Entwicklung das Neueste und Beste ist. Eines dieser Frameworks ist Google Web Toolkit. Frameworks wie dieses sind eine gute Sache für die Entwicklung... aber für Leistungstests können sie ein Problem darstellen. Für Leistungstests ist es am besten, einen Proxy-Server zu verwenden, der den gesamten Datenverkehr zwischen einem Browser und der Anwendung aufzeichnet. In den meisten Fällen handelt es sich dabei um einfaches http mit html oder xml als Protokoll. So ist es einfach, den aufgezeichneten Test wieder abzuspielen und mit anderen Werten zu parametrisieren. In den meisten Fällen verwende ich JMeter mit ein paar guten Plugins wie dem Plugins bei Google Code. Zunächst setzen Sie Ihren Browser auf einen Proxy, den Sie in JMeter definieren. JMeter zeichnet die von Ihnen durchgeführten Anfragen auf.

Bild

Danach können Sie den Datensatzed Anfragen an die Anwendung senden. Natürlich müssen Sie zunächst geeignete Testdaten hinzufügen, damit jede Sitzung unterschiedliche Daten enthält.

Bild Als ich meine ersten GWT-Anwendungen aufzeichnete, fand ich heraus, dass GWT sein eigenes proprietäres Protokoll verwendet, das in eine Art JSON verpackt ist. Das bringt mindestens 3 Herausforderungen mit sich, wenn Sie JMeter für die Aufzeichnung und Wiedergabe verwenden. In den folgenden 4 Absätzen werde ich einen Überblick über GWT geben und Ihnen drei der Tricks verraten, die ich verwendet habe, um Skripte für GWT-Anwendungen aufzeichnen und wiedergeben zu können. In meinem nächsten Blog werde ich auch einen alternativen Ansatz für Test-Frameworks wie GWT erläutern.

GWT-Übersicht

GWT ist ein Framework, in dem Sie eine Anwendung programmieren können, die in Javascript und einen Serviceteil (Java) vorkompiliert wird. Der Javascript-Teil wird für eine einzelne Seitenansicht in einem Browser verwendet. Auf diese Weise haben Sie eine sehr reaktionsschnelle Anwendung, da Sie die Seiten nicht immer wieder neu laden müssen. GWT verfügt auch über eine Vielzahl von Steuerelementen, die Sie verwenden können, ohne sich um die Kommunikation zwischen Ihrem Steuerelement und Ihrem Dienst kümmern zu müssen. Der gesamte Javascript- und Kommunikationscode wird durch den Precompile-Schritt generiert.

3 Tricks zur Verwendung von JMeter für GWT-Lasttests

GWT-Sitzungskontext

GWT verwendet eine Sitzung für jeden einzelnen Benutzer. Hier sehen Sie eine Beispielanfrage, die vom GWT generierten Javascript-Frontend kommt:

7|0|4|https://myserver:9080/myurl/|ABE2C0B156012B8657E5E26645105F43| org.class.MyClass|Feldname|1|2|3|4|0|

Eines der ersten Dinge, die Sie sehen könnten, ist eine Art Hash-Code(ABE2C0B156012B8657E5E26645105F43). Dieser Code befindet sich in einer der ersten html-Seiten mit der Dateierweiterung .nocache, die zuvor abgerufen wird. Dies ist eine Art Sitzungskontext. Sie benötigen ihn für jede einzelne Sitzung.

Objekt-ID-Verschleierung/Komprimierung

Wenn Sie ein Objekt über GWT im Frontend per ID anfordern, wird es von GWT obfuskiert/komprimiert. Um vordefinierte Datensätze abrufen zu können, müssen Sie sie entschlüsseln/dekomprimieren. In dem Beispiel unten fordere ich einen Datensatz mit der ID 318 (E$) an. Was Sie in der Kommunikation sehen, ist E$.

//OK[7,1,["java.lang.Integer/3438268394"],0,7,E$]

Ich habe einige Zeit gebraucht, um herauszufinden, wie ich die GWT-verschleierten/komprimierten IDs den IDs zuordnen kann, die in der Anwendung verwendet werden. Schließlich konnte ich eine Funktion erstellen, um eine ID zu komprimieren/verschlüsseln, so wie GWT es tut.

String chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789$_"; long id = 318; String out = ""; while(id > 0){ long charpos = id % 64; id /= 64; out = chars.charAt((int)charpos) + out; } System.out.println("GWT id: " + out);
GWT-spezifisches JSON

Das nächste Problem, das ich gefunden habe, ist, dass bei einer Liste von Objekten die Feldlänge nicht für alle Objekte in der Liste gleich ist. Im späteren Teil einer Anfrage sehen Sie einige Id's. In dieser Liste ist die Feldlänge für jedes Objekt ebenfalls festgelegt, zusammen mit einem Verweis auf den Wert, der in einigen der vorhergehenden Datensätze verwendet wurde. Hier sehen Sie eine Beispiel-JSON-Antwort von GWT.

//OK[35,8,34,27,5,'CvA', 4,26,3,8,33,27,5,'CvB', 4,0,3,8,7,6,5,'Cvh', 4,0,3,30,2,2559,1,["com.search.searchResult/3409195600","java.util.ArrayList/4159755760", "com.data.client.message.MyMessageSummary/3311733355", "java.lang.Long/4227064769", "type.type1", "Mein Objekttyp 1.", "08-10-2012 10:06", "55863485", "04-10-2012 11:27", " type.type2", "Mein Objekttyp 54", "04-10-2012 11:28", "05-10-2012 11:27",

Diese Antwort stellt eine Liste mit 4 Datensätzen dar. Die ersten 4 Zeilen enthalten einige Informationen über die Objekt-ID und die Datenmenge für diesen Datensatz, die sich von den vorherigen Datensätzen unterscheiden wird.

DatensatzDatumTyp
34508-10-2012 10:06typ.typ1
34604-10-2012 11:27typ.typ2
34704-10-2012 11:28typ.typ1
34805-10-2012 11:27typ.typ2

Wie Sie sehen können, werden die Daten type.type1 und type.type2 in den JSON-Daten nur zwei Mal angezeigt. Dies, während sie 4 Mal verwendet werden. GWT verwendet eine Art von Zeigern zwischen den Datensätzen, um auf Daten zu verweisen, die zuvor verwendet wurden.

Andere Art des Testens

Das war der Punkt, an dem ich beschloss, dass wir einen anderen Weg brauchen, um GWT-Anwendungen zu testen. In den GWT-Handbüchern wird beschrieben, wie man spezielle Hooks im Backend-Code erstellt, um die einzelnen Backend-Dienste individuell zu testen. Das ist etwas, das ich nicht verwenden kann, da verschiedene Teams die Anwendungen entwickeln und die Erstellung zusätzlicher Hooks eine Änderung der Anwendung und unterschiedlichen Code für die Produktion und das Testen bedeuten würde. Meiner Meinung nach ist dies nicht die beste Methode, um Skalierbarkeit und Leistung zu testen. Funktionstester verwenden Selenium häufig für funktionale Tests. Nach einer Weile habe ich eine Methode gefunden, Selenium in Kombination mit JMeter für Leistungstests zu verwenden. Ich werde diese Methode später in einem Blog beschreiben.

Verfasst von

Mark Bakker

Contact

Let’s discuss how we can support your journey.