Performance-Tool JMeter


... [ Top : Thema Performance-Analyse-Werkzeuge für Java ] ... [ Vorheriges Kapitel : Performance-Begriff ] ... [ Nächstes Kapitel : Weitere Performance-Tools ] ...

Übersicht: Performance-Tool JMeter


Das Projekt JMeter

JMeter ist ein in Java geschriebenes Performancemessungs-Tool, welches als Jakarta-Prokjekt unter dem Banner der Apache Software Foundation weiterentwickelt wird. Die Dokumentation sowie der Quellcode werden der Öffentlichkeit zur Verfügung gestellt, so dass man das Tool entsprechend seinen Anforderungen anpassen kann.
Mit JMeter lassen sich zur Zeit für die folgenden Ressourcen Performance-Messungen durchführen : Die Performance-Messungen können dabei nicht nur die benötigten Zeiten berücksichtigen, sondern auch auf die gelieferten Inhalte in textueller Hinsicht eingehen. Allerdings ist JMeter nicht in der Lage die Allokationen von Speicher zu analysieren und misst die Zeit nur in Gänze für das zu testende Objekt.

Nach oben


Oberflächenaufbau

Die Oberfläche von JMeter besteht aus zwei Teilen. Ein TreeView-Element auf der linken Seite dient zum Anzeigen und Editieren des Aufbaus des Testplans. Der restliche Teil der Oberfläche ermöglicht die Eigenschaften der einzelnen Elemente des Testplans anzupassen oder falls es eine Ergebnisoberfläche ist, die Ergebnisse anzeigen zu lassen. Es wird immer automatisch die Oberfläche des aktuell ausgewählten Elementes des Testplans angezeigt.

Das TreeView-Element ist leicht über Pop-Up-Menüs zu editieren. So können Element hinzugefügt, gelöscht oder verschoben werden.

In der Menüleiste kann man unter dem Menüeintrag "Start" den aktuellen Testplan starten lassen. In der neuesten Version wird eine laufende Messung durch ein grünes Rechteck in der oberen rechten Ecke erkennbar.


Nach oben


Programmstruktur und Komponenten

Testplan

Eine Performance-Messung wird im Programm immer durch einen Testplan abgebildet. Ein Testplan ist dabei nichts Anderes als ein Container, welcher alle Komponenten des Testplanes beinhaltet. Durch die Eigenschaft, dass mehrere Elemente auch wieder Container für andere Elemente sein können entsteht eine hierarchische Struktur. Der Testplan kann auch in einer Datei gespeichert werden und somit wiederverwendet werden.Die Komponenten des Testplans und deren Informationen werden dabei einfach in eine xml-Datei umgewandelt.

Thread-Gruppe

Zum jedem Testplan muss mindestens eine Thread-Gruppe gehören, die die Benutzer eines Objektes simuliert. Eine Thread-Gruppe steuert, die Anzahl der Threads, die zur Performance-Messung eingesetzt werden. Innerhalb einer vorgegebenen Anlaufzeit werden alle Threads gleichverteilt gestartet. Eine Angabe, wie oft die Thread-Gruppe aufgerufen werden soll, ist auch möglich. Nach dem alle Threads beendet wurden, ist die Thread-Gruppe ebenfalls beendet.

Logic Controller

Logic Controller steuern die Abarbeitung einzelner Teile (insbesondere der Sampler) des Testplans für jeden einzelnen Thread. So können diese Teile z.B. nur einmal ausgeführt werden, zufällig ausgewählt werden, wiederholt werden, oder abwechselnd bei jedem Threaddurchlauf bearbeitet werden.

Timer

Timer bewirken, dass jeder Thread nach einem Durchlauf für eine definierte Zeit angehalten wird, bevor er erneut den Testplan abarbeitet. Standardmäßig gibt es konstante Timer oder Zufalls-Timer.

Sampler

Zu jedem Testplan gehören auch ein oder mehrere Sampler. Diese Sampler stellen die Verbindung zu den zu testenden Objekten her. Zur Zeit gibt es Sampler für HTTP-, FTP, JDBC-, SOAP/XML- und Java-Objekte.
Den Samplern können noch benötigte oder gewünschte Parameter mitgegeben werden, um das zu testende Objekt zu ermitteln und mit Informationen zu versehen, die es für den Testlauf benötigt.

Konfigurations-Elemente

Zu den einzelnen Samplern oder für die Thread-Gruppe gibt es noch diverse Konfigurations-Elemente. Eine Gruppe von Elementen dient dem Anlegen von Default-Parametern für eine Menge von gleichartigen Sampler-Objekten. Für mehrere HTTP-Objekte kann so z.B. an einer Stelle der anzusprechende HTTP-Server hinterlegt werden.


Für HTTP-Ressourcen gibt es darüber hinaus noch Elemente um Header-, Authorizationen- und Cookie-Informationen zentral für den Testplan oder das HTTP-Sample-Objekt zu speichern.

Listener

Zur Ausgabe von Ergebnissen gibt es die Listeners. Sie verarbeiten und visualisieren die Ergebnisse, die beim Testen ermittelt werden. Neben einem normalen Mitschreiben der Ergebnisse für jeden einzelnen Aufruf jedes Threads und einer Verdichtung der Werte für jedes Testobjekt gibt es auch eine Aufbereitung als Funktionskurve.
Weitere Beispiele in den Beispielmessungen.

Assertions

Um eine inhaltliche Überprüfung der getesteten Objekte zu gewährleisten gibt es die Möglichkeiten Zusicherungen ("Assertions") an die Ergebnisse zu stellen. Diese Zusicherungen können auf textueller Basis mit Hilfe von regulären Ausdrücken definiert werden. Eine weitere Art der Zusicherung bezieht sich auf die benötigte Antwortzeit. Wird die Antwortzeit überschritten, so gilt die Zusicherung als nicht erfüllt.

Modifiers

Modifizierer-Komponenten dienen zum Anpassen von Eigenschaften und Parametern vom Sample-Objekten. Dies kann z.B. für HTML-Ressourcen dass Parsen nach Links oder Formularfeldern sein. Dabei werden dann übermittelte Werte eines Aufrufes für den folgenden Aufruf genutzt. Eine weitere Möglichkeit besteht darin verschiedene Parameterkombinationen nacheinander aus einer xml-Datei einzulesen, die dann für jeden Aufruf wechseln. Um mehrere verschiedene User zu definieren kann man einem Parameter für jeden Aufruf iterierende Werte zuweisen.

Variablen

In der Testplan-Komponente ist es möglich Variablen zu definieren, die dann in allen Textfeldern aller enthaltenen Komponenten verwendet werden können. Die Benutzung erfolgt mittels der folgenden Form genutzt werden :
${varname}

Funktionen

Funktionen können ähnlich wie die Variablen in allen Textfeldern aller Komponenten eingesetzt werden. Die Funktionen können mit der folgenden Form aufgerufen werden :
${__funcname(par1,par2,...)}
Die Funktion ${__threadnum} liefert so zum Beispiel, die Nummer des aktuellen Threads.

Aufnehmen eines Testplans

JMeter bietet die Möglichkeit einen HTTP-Testplan aufzunehmen. Dabei fungiert JMeter als Proxy-Server und legt für alle angeforderten Seiten einen Sampler-Controller an. Die aufzuzeichnende Seiten können mittels regulären Ausdrücken gefiltert werden.

Nach oben


Beispielmessungen

Die Beispielmessungen zeigen gängige Situation, in denen JMeter zur Performance-Messung sehr nützlich ist. Im Rahmen dieser Beipiele werden auch die einzelnen Elemente genauer erklärt.

HTTP-Ressource

In diesem Beispiel soll ein PHP-Skript auf einem Webserver getestet werden. Das Skript berechnet die Fakultät einer übergebenen Zahl und liefert eine Textanwort mit dem Ergebnis.
Eine Anfrage könnte in etwa so aussehen : http://localhost/jmeter_test.php3?zahl=3
Die Antwort wäre dann : "Die Fakultät von 3 ist 6"

Zuerst wird ein Testplan angelegt, der die weiteren Komponenten auf nimmt. Anschließend wird wird eine Thread-Gruppe hinzugefügt, die die Aufgabe der Anfragenstellung übernimmt. In unserem Beispiel legen wir eine Thread-Gruppe mit einem Thread an, der innerhalb von einer Sekunde gestartet wird. Die Thread-Gruppe wird solange aufgerufen, bis der Test von uns beendet wird.

Der Konstante Timer sorgt für eine Startverzögerung eines jeden Threads um 300ms.

Um die Anfrage zu definieren wird ein HTTP-Request-Sampler der Thread-Gruppe hinzugefügt und die Daten bezüglich des Servers und des aufzurufenden Skriptes eingegeben. In diesem Element werden auch die zu übergebenden Paramter festgelegt. In unserem Fall "zahl" mit dem Wert "100".

Um festzustellen, ob die Seite korrekt übertragen wurde, wird in dem "Response-Assertion"-Element ein Text vorgegeben, der in der vom Skript gelieferten Textantwort enthalten sein muss, damit die Anfrage erfolgreich war. In unserem Fall gehen wir von einer korrekt übertragenen Seite aus, wenn der Text "Fakultät" in der Antwort enthalten ist.

Um nach dem Testlauf die Ergebnisse zu betrachten können wir verschieden Listener dem HTTP-Request-Element hinzufügen.
Da wir eine Assertion in unserem Testplan haben, können wir uns jede einzelne Anfrage in Bezug auf die Assertion mit dem "Assertion Results" anschauen.

Um die Ergebnisse aller gestellten Requests für sich zu betrachten, gibt es den Listener "Zeige Ergebnisse in der Tabelle". Hier wird die Antwortzeit ersichtlich sowie ob der Thread allen Assertions entsprochen hat.

Falls man mehrere Sampler-Objekte hat, biete sich der Listener "Aggregate-Report" an. Er verdichtet die Daten für die einzelnen Sampler-Objekte.

Der Graph-Result-Listener visualisiert die ermittelten Daten. Die Antwortzeiten der einzelnen Anfragen sowie die Durchschnittszeit, die durchschnittliche Abweichung der Anfragen werden als Punkte dargestellt.

Nach oben



Java-Objekt

Im nächsten Beispiel soll ein Java-Objekt oder eine Methode einem Performance-Test unterzogen werden. Um eine Methode oder Objekt testen zu können muss es in eine Klasse, die das Interface JavaSampleClient implementiert, eingebettet sein. Das Interface besteht aus 3 Methoden. "runTest" führt den eigentlichen Testaus und liefert das Ergebnis, "setupTest" initialisiert die möglichen Tests und "tearDown" wird bei Beendigung des Testlaufes ausgeführt.
Im folgenden Beispielcode ist die Methode "fakultaet()" eingebettet.
package org.apache.jmeter.protocol.java.test;

import org.apache.jmeter.protocol.java.sampler.JavaSamplerClient;
import org.apache.jmeter.samplers.SampleResult;

public class MyTest implements org.apache.jmeter.protocol.java.sampler.JavaSamplerClient {

	double zahl=1.0;
	
private double fakultaet(double zahl) {
	return zahl>1 ? zahl*fakultaet(zahl-1) : 1.0;
}

//Wird bei einem Sample-Aufruf ausgeführt
public org.apache.jmeter.samplers.SampleResult runTest(java.util.HashMap arguments) {

	SampleResult res = new SampleResult();

	//Startzeit ermitteln
	long start = System.currentTimeMillis();

	//zu messende Methode aufrufen
	double fak = fakultaet(zahl);

	//Endzeit ermitteln
	long end = System.currentTimeMillis();

	//Ergebnisse zurückgeben
	res.setTime(end - start);
	res.setSuccessful(true);
	res.setSampleLabel("Fakultät von "+zahl+" ist "+fak);
	
	return res;
}

//Initialisieren und auslesen der übergebenen Parameter
public void setupTest(java.util.HashMap arguments) {

	if (arguments.containsKey("zahl")) {
			zahl=Double.parseDouble((String)(arguments.get("zahl")));
		}
	}

//Bereinigen der benötigten Ressourcen, falls nötig
public void teardownTest(java.util.HashMap arguments) {}

}

Diese Klasse wird nun durch auswählen im Java-Request-Sampler benutzt. Die Zeit für die Berechnung der Fakultät wird im SampleResult zurückgegeben.
Im Vergleich zum vorherigen Beispiel wird nur das Sample-Objekt ausgewechselt. Die Listener können entsprechen benutzt werden.

Beim Ergebnis-Objekt wird auch hier der Erfolg, der zurückgebenen Text und die benötigte Zeit eines jeden Aufrufes dokumentiert.

Nach oben


... [ Top : Thema Performance-Analyse-Werkzeuge für Java ] ... [ Vorheriges Kapitel : Performance-Begriff ] ... [ Nächstes Kapitel : Weitere Performance-Tools ] ...