Versionen im Vergleich

Schlüssel

  • Diese Zeile wurde hinzugefügt.
  • Diese Zeile wurde entfernt.
  • Formatierung wurde geändert.

⯇ Vorheriges Tutorial

Im ersten Tutorial beginnen wir mit der Einrichtung unseres Projekts. Am Ende dieses Teils haben wir das Projekt vollständig aufgesetzt und sind bereit, den ersten Test zu schreiben. In den folgenden Tutorials definieren wir dann verschiedene Szenarien, um unsere Beispielintegration aus Getting Started - jadice web toolkit hinsichtlich seiner Performance zu testen.

Info

Wir empfehlen den Code bereits vor der Durchführung des Tutorials hier herunterzuladen.

Gatling

JMeter

Gatling JMeter ist ein Framework, das in der Lage ist, komplexes Nutzerverhalten nachzustellen und zu simulieren. Die während des der Performancetests gesammelten Daten werden aufbereitet und in übersichtlicher Form als HTML-Datei bereitgestellt. Tests innerhalb von Gatling werden in der Programmiersprache Scala geschriebenJMeter werden in diesem Beispiel über die von JMeter mitgelieferte UI erstellt.

Begriffe

Bevor wir uns den ersten Tests zuwenden, machen wir uns mit den in Gatling diesem Szenario genutzten Begriffen vertraut:

  • Szenario
    Ein Szenario beschreibt eine Abfolge von Interaktionen des Nutzers mit der Anwendung. Bspw. Beispielsweise könnte ein Szenario folgendermaßen aussehen:
    1. Nutzer authentifiziert sich
    2. Nutzer ruft Dokument auf
    3. Nutzer dreht eine Seite
    4. Nutzer scrollt 3 mehrere Seiten nach untenNutzer exportiert das Dokument als PDF
  • User
    In einer realen Umgebung wird die Anwendung nicht nur von einer Person genutzt, sondern von mehreren auf einmal. Unter Gatling JMeter ist es ebenfalls möglich, mehrere Nutzer gleichzeitig oder zeitlich versetzt auf die Anwendung zugreifen zu lassen, indem zufällig erzeugte Client-Ids verwendet werden.
  • Verbindungsmethode
    Für aussagekräftige Tests sollte die Verbindungsmethode idealerweise die Verbindungsmethode gewählt werden, welche bei Ihrer jadice web toolkit Implementierung standardmäßig aktiviert ist.  Zur Zur Auswahl stehen hierbei:
    • Longpoll
    • Server-Sent Events
    • WebSockets
    SetUp
    Über die setUp-Methode wird das Szenario vorkonfiguriert. Hier wird unter anderem die Nutzeranzahl eingestellt

Der wesentliche Teil der Last, die auf dem Server erzeugt wird, entsteht allerdings durch das Tile-Rendering, sprich das Erzeugen der Bilddaten, die auf dem Client nachher für die Darstellung einer Seite oder eines Thumbnails verwendet werden. Dieses ist komplett unabhängig von der Verbindungsmethode, da für das Tile-Rendering ein separates Servlet zur Verfügung steht, was durch ein simples HTTP-GET vom Client angesprochen wird.

  • Thread Group

In JMeter wird mit ThreadGroups gearbeitet, die eine einstellbare Anzahl von Threads erzeugt, die wir in diesem Szenario nutzen, um verschiedene User zu simulieren, die alle das gleiche Szenario abarbeiten. In einer zweiten ThreadGroup werden wir dann zum Schluss überprüfen, ob die erzeugten Metriken der Erwartung entsprechen.


Projektstruktur

Für den Anfang erstellen wir ein neues Mavenprojekt mit folgender Projektstruktur:

Codeblock
languagexml
themeRDarklanguagexml
titleVerzeichnisstruktur
├── pom.xml
├── src/test/resourcesjmeter/     ├── bodies					- Wie der Name vermuten lässt, werden- wirDatei hierfür Request-bodiesdie ablegen.jmx Datei, die den jMeter └── data					- Hier legen wir sonstige benötigte Daten ab
└── Testplan definiert
├── src/test/scalaresources/ 		- Anleitung falls die └──Performancetests per orgMicrometer/jwt/performance		- Hier landen unsere Scala-Tests

Maven

In den properties der pom.xml konfigurieren wir die aktuellen Gatling-Versionen:

Codeblock
themeRDark
languagexml
titlepom.xml - properties
<gatling.version>2.3.1</gatling.version>
<gatling-plugin.version>2.2.4</gatling-plugin.version>

 

Die benötigten dependencies sind folgende:

xml
Codeblock
themeRDark
language
Prometheus/Grafana überwacht werden sollen.

Maven

Im Wesentlichen besteht dieses Maven Submodule aus einem Plugin, das in ein Maven-Profil verpackt ist und bei Bedarf die Tests ausführt. Dazu werden nach dem Testlauf im Target-Verzeichnis die Ergebnisse vorhanden sein. Bei Fehlern wird der Build abbrechen, sodass weitere Submodule nach diesem nicht mehr ausgeführt werden.


Der Testlauf lässt sich mit folgendem Befehl ausführen:

Codeblock
languagejava
mvn -P webtoolkit-jmeter verify



Codeblock
languagexml
themeRDark
titlepom.xml - jmeter-maven- dependency
<dependency>
      <groupId>io.gatling.highcharts</groupId>
      <artifactId>gatling-charts-highcharts</artifactId>
      <version>${gatling.version}</version>
      <scope>test</scope>
</dependency>

 

Außerdem benötigen wir noch das Gatling-Maven-Plugin. Es ermöglicht die Ausführung von Gatling aus Maven heraus. Hier konfigurieren wir auch unsere oben erstellten Verzeichnisse:

Codeblock
themeRDark
languagexml
titlepom.xml - Gatling-Maven-Plugin
<plugin>
     <groupId>io.gatling</groupId>
     <artifactId>gatling-maven-plugin</artifactId>
     <version>${gatling-plugin.version}</version>
     <configuration>
           <configFolder>${project.basedir}/src/test/resources</configFolder>
           <dataFolder>${project.basedir}/src/test/resources/data</dataFolder>
           <requestBodiesFolder>${project.basedir}/src/test/resources/bodies</requestBodiesFolder>
           <simulationsFolder>${project.basedir}/src/test/scala</simulationsFolder>
           <resultsFolder>${project.build.directory}/reports/gatling</resultsFolder>
           <runMultipleSimulations>true</runMultipleSimulations>
     </configuration>
</plugin>

plugin
<profiles>
		<profile>
			<id>webtoolkit-jmeter</id>
			<activation>
				<activeByDefault>false</activeByDefault>
			</activation>
			<build>
				<plugins>
					<plugin>
						<groupId>com.lazerycode.jmeter</groupId>
						<artifactId>jmeter-maven-plugin</artifactId>
						<version>3.6.0</version>
						<executions>
							<!-- Generate JMeter configuration -->
							<execution>
								<id>configuration</id>
								<goals>
									<goal>configure</goal>
								</goals>
							</execution>
							<!-- Run JMeter tests -->
							<execution>
								<id>jmeter-tests</id>
								<goals>
									<goal>jmeter</goal>
								</goals>
							</execution>
							<!-- Fail build on errors in test -->
							<execution>
								<id>jmeter-check-results</id>
								<goals>
									<goal>results</goal>
								</goals>
							</execution>
						</executions>
					</plugin>
				</plugins>
			</build>
		</profile>
	</profiles>  


Unsere vollständige pom.xml sieht folgendermaßen aus:

Codeblock
languagexml
themeRDarklanguagexml
titlepom.xml - vollständig
collapsetrue
<project xmlns="http://maven.apache.org/POM/4.0.0"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

	<modelVersion>4.0.0</modelVersion>
	<artifactId>jwt-tutorial-000-performance<performancetest</artifactId>
	<name>jwt-tutorial-000-performance<performancetest</name>
	<description>Getting Started with Jadice Web Toolkit performancetest</description>
	<url>https://levigo.de/info/display/JKB/Getting+Started+-+Performancetests+in+JWT<x/O4C-BQ</url>
	<packaging>jar</packaging>

	<parent>
		<artifactId>jwt-tutorial</artifactId>
		<groupId>org.jwt</groupId>
		<version>5.711.017.2<4</version>
	</parent>

	<profiles>
		<properties><profile>
			<gatling.version>2.3.1</gatling.version>
		<gatling-plugin.version>2.2.4</gatling-plugin.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>io.gatling.highcharts</groupId>
			<artifactId>gatling-charts-highcharts</artifactId>
			<version>${gatling.version}</version>
			<scope>test</scope>
		</dependency>
	</dependencies>
	<build>
		<plugins>
			<plugin>
				<groupId>io.gatling</groupId>
				<artifactId>gatling-maven-plugin</artifactId>
				<version>${gatling-plugin.version}</version>
				<configuration>
					<configFolder>${project.basedir}/src/test/resources</configFolder>
					<dataFolder>${project.basedir}/src/test/resources/data</dataFolder>
					<requestBodiesFolder>${project.basedir}/src/test/resources/bodies</requestBodiesFolder>
					<simulationsFolder>${project.basedir}/src/test/scala</simulationsFolder>
					<resultsFolder>${project.build.directory}/reports/gatling</resultsFolder>
					<runMultipleSimulations>true</runMultipleSimulations>
				</configuration>
			</plugin>
		</plugins>
	</build><id>webtoolkit-jmeter</id>
			<activation>
				<activeByDefault>false</activeByDefault>
			</activation>
			<build>
				<plugins>
					<plugin>
						<groupId>com.lazerycode.jmeter</groupId>
						<artifactId>jmeter-maven-plugin</artifactId>
						<version>3.6.0</version>
						<executions>
							<!-- Generate JMeter configuration -->
							<execution>
								<id>configuration</id>
								<goals>
									<goal>configure</goal>
								</goals>
							</execution>
							<!-- Run JMeter tests -->
							<execution>
								<id>jmeter-tests</id>
								<goals>
									<goal>jmeter</goal>
								</goals>
							</execution>
							<!-- Fail build on errors in test -->
							<execution>
								<id>jmeter-check-results</id>
								<goals>
									<goal>results</goal>
								</goals>
							</execution>
						</executions>
					</plugin>
				</plugins>
			</build>
		</profile>
	</profiles>
</project>