jMeter + JSF Trinidad

jMeter eignet sich sehr gut für Stresstests. Dieses HOWTO zeigt wie es möglich ist ein Stresstest für eine JSF-Trinidad-Anwendung mit jMeter aufzunehmen und zu starten. jMeter kann von hier runter geladen werden: http://jakarta.apache.org/jmeter/

Nach dem entpacken muss die “<jMeter>/bin/jmeter.sh” ausgeführt werden. Unter Windows dementsprechend “<jMeter>/bin/jmeter.bat”. Nach dem erfolgreichen Start der Anwendung sollte zu erst eine neue “Thread Group” im Testplan erstellt werden:

In der Thread Group kann eingestellt werden mit wie vielen Usern der Test simuliert werden soll und wie oft.

Als nächstes legen wir ein Config Element “HTTP Requests Defaults” an.

Hier können Angaben zum Server, Port, Protokoll und Ziel-Path gemacht werden.

Da JSF-Trinidad die JSESSIONID in einem Cockie ablegt, fügen wir noch einen “HTTP Cockie Manager” hinzu. Dieser braucht nicht konfiguriert zu werden. Er muss einfach da sein damit es funktioniert.

Beim testen einer JSF Applikation muessen einige Dinge beachtet werden. JSF arbeitet nach dem PostBack Pattern, bei dem alle Formularinhalte per POST-Request an das aktuelle Formular zurueckgeschickt werden. Jede gerenderte HTML-Seite die im Browser zu sehen ist, stellt eine View da und hat einen eindeutigen Identyfier, den ViewState. Der ViewState Identyfier muss bei jedem POST-Request mitgeschickt werden, da ansonsten der Komponentenbaum nicht reproduziert werden kann. In so einem Fall wuerde nach der ersten Phase des JSF-Lifecycles gleich die sechste Phase ausgefuehrt und eine leere Seite gerendert werden.
Mit einem RegularExpressionExtractor in jMeter ist es moeglich die ViewState auszulesen und beim naechsten Request als Post-Parameter mitzuschicken. Dazu benoetigt es ein rechtsklick auf die Thread Group in einem jMeter-Testfall, wo schliesslich im Contextmenue folgendes ausgewaehlt werden muss “Add” – “Post Processors” – “Regular Expresseion Extractor”.

Das Formular zum Extractor muss dann wie folgt ausgefuellt werden:

Reference Name: jsfSTATE
Regular Expression: <input type="hidden" Name="org\.apache\.myfaces\.trinidad\.faces\.STATE" value="(.+?)">
Template: $1$
Match No. (0 for Random): 0
Default Value:

Dannach muss bei jedem Post-Request der Parameter “org.apache.myfaces.trinidad.faces.STATE” auf den Wert “${jsfSTATE}” gesetzt werden. Die Parameter zu einem Request koennte demach so aussehen:

loginName: name
loginPassword: password
org.apache.myfaces.trinidad.faces.FORM: loginForm
org.apache.myfaces.trinidad.faces.STATE: ${jsfSTATE}
source: loginButton

Um Testergebnisse ansehen zu können muss noch ein “Summary Report” hinzugefügt werden.

Der Testplan ist jetzt soweit fertig gestellt. Jetzt muss nur noch ein Test aufgezeichnet werden. Dafür fügen wir einen “HTTP Porxy Server” der Work Bench hinzu.

Der Proxy Server muss jetzt auf einen bestimmten Port und auf eine bestimmte URL konfiguriert werden, auf die er lauschen soll. Ganz wichtig ist auch der unterste Bereich der Maske, “URL Patterns to Exclude”. Hier sollten unbedingt mit regulären Ausdrücken Bilder, CSS und JavaScript ausgeschlossen werden, da diese für den Test unwichtig sind.

Nach dem starten des Proxy Servers muss dieser noch im Browser eingestellt werden. Im Firefox ruft man dazu den Menüpunkt “Preferences -> Advanced -> Network” auf und klickt dann auf “Settings”.

Hier muss jetzt der entsprechende Proxy mit dem richtigen Port eingetragen werden. Ganz wichtig ist hierbei das, dass Feld “No Proxy for” leer ist.

Wenn der Proxy eingetragen ist, kann damit begonnen werden die WebAnwendung aufzurufen. Jedes Klick und jedes Seitenaufruf auf den Anwendung wird nun von jMeter aufgezeichnet. Ein einfaches Test könnte z.B. darin bestehen sich an einer WebAnwendung anzumelden und alle Links im Hauptmenü durchzuklicken. Anschliessend könnte man sich abmelden.

Nach dem der Test aufgezeichnet ist, kann der Proxy Server in jMeter gestoppt werden.

Wenn alles geklappt hat, dann sieht der linke Bereich in jMeter wie folgt aus:

Jetzt ist es wichtig das bei jedem Request die Request-Variable “org.apache.myfaces.trinidad.faces.STATE” den Wert “${jsfSTATE}” hat. Die Variable kommt aus dem “Regular Expresseion Extractor”.

Dieser Wert muss leider bei jedem Request per Hand gesetzt werden. Einen anderen Weg habe ich bisher noch nicht gefunden. Wenn das erledigt ist, kann ein einfacher Test gestartet werden, über den Menüpunkt “Run -> Start”.

Nach dem Ausführen des aufgezeichneten Tests ist im Summary Report die Ergebnissliste zu sehen:

Jetzt kann man in der Thread Group die “Number of Threads (users)” auch hoch schrauben auf 50 und sich anschauen wie die Anwendung reagiert.

Ich hoffe die Anleitung war hilfreich und hat weiter geholfen.

Eine Beschreibung zu jMeter + MyFaces Core ist hier im Wiki zu finde:

http://wiki.apache.org/myfaces/PerformanceTestingWithJMeter?highlight=%28jmeter%29