Gatling Performance Testing Cheatsheet¶
Installation¶
| Plattform | Befehl |
|---|---|
| Ubuntu/Debian | wget https://repo1.maven.org/maven2/io/gatling/highcharts/gatling-charts-highcharts-bundle/3.10.3/gatling-charts-highcharts-bundle-3.10.3-bundle.zip && unzip gatling-charts-highcharts-bundle-3.10.3-bundle.zip && sudo mv gatling-charts-highcharts-bundle-3.10.3 /opt/gatling |
| macOS (Homebrew) | brew install gatling |
| Windows (Manual) | Download from Maven Central, extract to C:\gatling, add bin directory to PATH |
| SDKMAN (Linux/Mac) | sdk install gatling |
| Docker | docker pull denvazh/gatling:latest |
| Maven Plugin | Add io.gatling:gatling-maven-plugin:4.6.0 to pom.xml |
| Gradle Plugin | Add id 'io.gatling.gradle' version '3.10.3' to build.gradle |
Grundlegende Befehle¶
| Befehl | Beschreibung |
|---|---|
gatling.sh |
Starten Sie den interaktiven Modus, um Simulationen auszuwählen und auszuführen |
gatling.sh -s com.example.MySimulation |
Eine bestimmte Simulationsklasse ausführen |
gatling.bat -s com.example.MySimulation |
Simulation auf Windows ausführen |
gatling.sh --help |
Hilfe und verfügbare Optionen anzeigen |
gatling.sh --version |
Gatling-Version anzeigen |
recorder.sh |
Starten Sie die Gatling Recorder GUI zum Aufzeichnen von Browser-Sitzungen |
recorder.bat |
Launch Recorder auf Windows |
gatling.sh -ro simulation-folder-name |
Berichte aus vorhandenen Simulationslogs generieren |
gatling.sh -s MySimulation -nr |
Simulation ohne Generierung von Berichten ausführen |
gatling.sh -s MySimulation -rd "Test description" |
Mit benutzerdefinierter Beschreibung für Berichte ausführen |
mvn gatling:test |
Führen Sie alle Gatling-Tests mit Maven aus |
mvn gatling:test -Dgatling.simulationClass=MySimulation |
Führen Sie eine spezifische Simulation mit Maven aus |
gradle gatlingRun |
Führen Sie alle Gatling-Tests mit Gradle aus |
gradle gatlingRun-com.example.MySimulation |
Spezifische Simulation mit Gradle ausführen |
ls user-files/simulations/ |
Verfügbare Simulationsdateien auflisten |
| ## Erweiterte Nutzung |
| Befehl | Beschreibung |
|---|---|
gatling.sh -s MySimulation -rf /custom/results |
Mit benutzerdefiniertem Ergebnisordner ausführen |
gatling.sh -s MySimulation -bf /custom/binaries |
Mit benutzerdefiniertem Binärverzeichnis ausführen |
gatling.sh -s MySimulation -rsf /custom/resources |
Mit benutzerdefiniertem Ressourcenverzeichnis ausführen |
gatling.sh -s MySimulation -df /custom/data |
Mit benutzerdefiniertem Datenverzeichnis ausführen |
gatling.sh -s MySimulation -cf /path/to/gatling.conf |
Mit benutzerdefinierter Konfigurationsdatei ausführen |
JAVA_OPTS="-Xms2G -Xmx4G" gatling.sh -s MySimulation |
Mit benutzerdefinierten JVM-Speichereinstellungen ausführen |
gatling.sh -s MySimulation -D baseUrl=https://api.example.com |
Systemeigenschaften an Simulation übergeben |
gatling.sh -s MySimulation -D users=100 -D duration=300 |
Mehrere Systemeigenschaften übergeben |
mvn gatling:test -Dgatling.jvmArgs="-Xms2G -Xmx4G" |
Maven-Ausführung mit benutzerdefinierten JVM-Argumenten |
docker run -v $(pwd)/user-files:/opt/gatling/user-files denvazh/gatling |
Gatling in Docker-Container ausführen |
gatling.sh -s Sim1 && gatling.sh -s Sim2 |
Mehrere Simulationen sequenziell ausführen |
for sim in Sim1 Sim2; do gatling.sh -s $sim -nr; done |
Stapellauf-Simulationen ohne Berichte durchführen |
mvn clean gatling:test -DbaseUrl=https://prod.example.com |
Maven-Ausführung mit umgebungsspezifischer URL |
gradle gatlingRun -Dusers=500 -Dduration=600 |
Gradle-Ausführung mit dynamischen Parametern |
gatling.sh -s MySimulation 2>&1 | tee test.log |
Ausführen und Ausgabe in Logdatei erfassen |
| ## Konfiguration |
Hauptkonfigurationsdatei (gatling.conf)¶
gatling {
core {
# Output directory for results
outputDirectoryBaseName = "simulation"
# Encoding for files
encoding = "utf-8"
# Timeout for requests
timeOut = 60000
# Directory for simulation classes
simulationClass = ""
}
http {
# Enable/disable SSL/TLS
enableGA = false
# Connection timeout
connectTimeout = 10000
# Request timeout
requestTimeout = 60000
# Max connections per host
maxConnectionsPerHost = 6
}
data {
# Directory for feeder files
file {
bufferSize = 256
}
}
charting {
# Indicators percentiles
indicators {
lowerBound = 800
higherBound = 1200
percentile1 = 50
percentile2 = 75
percentile3 = 95
percentile4 = 99
}
}
}
Systemeinstellungen Konfiguration¶
# Set via command line
gatling.sh -s MySimulation \
-Dgatling.core.outputDirectoryBaseName=custom-output \
-Dgatling.http.requestTimeout=30000 \
-Dgatling.charting.indicators.percentile1=90
Maven Konfiguration (pom.xml)¶
<plugin>
<groupId>io.gatling</groupId>
<artifactId>gatling-maven-plugin</artifactId>
<version>4.6.0</version>
<configuration>
<simulationClass>com.example.MySimulation</simulationClass>
<jvmArgs>
<jvmArg>-Xms2G</jvmArg>
<jvmArg>-Xmx4G</jvmArg>
<jvmArg>-XX:+UseG1GC</jvmArg>
</jvmArgs>
<systemProperties>
<baseUrl>https://api.example.com</baseUrl>
<users>100</users>
</systemProperties>
</configuration>
</plugin>
Gradle Konfiguration (build.gradle)¶
gatling {
simulations = {
include 'com/example/**/*Simulation.scala'
}
jvmArgs = ['-Xms2G', '-Xmx4G', '-XX:+UseG1GC']
systemProperties = [
'baseUrl': 'https://api.example.com',
'users': '100'
]
}
Häufige Anwendungsfälle¶
Anwendungsfall 1: Grundlegender API-Lasttest¶
# Create simulation file
cat > user-files/simulations/BasicApiTest.scala << 'EOF'
import io.gatling.core.Predef._
import io.gatling.http.Predef._
import scala.concurrent.duration._
class BasicApiTest extends Simulation {
val httpProtocol = http
.baseUrl("https://api.example.com")
.acceptHeader("application/json")
.contentTypeHeader("application/json")
val scn = scenario("Basic API Test")
.exec(http("Get Users")
.get("/users")
.check(status.is(200)))
.pause(1)
setUp(
scn.inject(
rampUsers(100) during (60 seconds)
)
).protocols(httpProtocol)
}
EOF
# Run the test
gatling.sh -s BasicApiTest
# View results
open results/basicapitest-*/index.html # macOS
xdg-open results/basicapitest-*/index.html # Linux
Anwendungsfall 2: Stresstest mit gradueller Last¶
# Create stress test simulation
cat > user-files/simulations/StressTest.scala << 'EOF'
import io.gatling.core.Predef._
import io.gatling.http.Predef._
import scala.concurrent.duration._
class StressTest extends Simulation {
val httpProtocol = http.baseUrl("https://api.example.com")
val scn = scenario("Stress Test")
.exec(http("Heavy Endpoint")
.post("/api/process")
.body(StringBody("""{"data": "test"}"""))
.check(status.is(200)))
setUp(
scn.inject(
nothingFor(5 seconds),
atOnceUsers(10),
rampUsers(50) during (30 seconds),
constantUsersPerSec(20) during (60 seconds),
rampUsersPerSec(20) to 50 during (60 seconds)
)
).protocols(httpProtocol)
.maxDuration(5 minutes)
.assertions(
global.responseTime.max.lt(5000),
global.successfulRequests.percent.gt(95)
)
}
EOF
# Run with custom memory settings
JAVA_OPTS="-Xms4G -Xmx8G" gatling.sh -s StressTest
Anwendungsfall 3: CI/CD-Integration mit Maven¶
# Add to Jenkins/GitLab CI pipeline
mvn clean gatling:test \
-Dgatling.simulationClass=com.example.PerformanceTest \
-DbaseUrl=${TEST_URL} \
-Dusers=${CONCURRENT_USERS} \
-Dduration=${TEST_DURATION}
# Check exit code for pass/fail
if [ $? -eq 0 ]; then
echo "Performance test passed"
else
echo "Performance test failed"
exit 1
fi
# Archive results
tar -czf gatling-results.tar.gz target/gatling/
Anwendungsfall 4: Browser-Sitzung aufzeichnen¶
# Start recorder
recorder.sh
# Configure in GUI:
# - Listening Port: 8000
# - Output folder: user-files/simulations
# - Class name: RecordedSimulation
# Configure browser proxy to localhost:8000
# Perform actions in browser
# Stop recording
# Run recorded simulation
gatling.sh -s RecordedSimulation
Anwendungsfall 5: Datengesteuertes Testen mit Feedern¶
# Create CSV data file
cat > user-files/resources/users.csv << 'EOF'
username,password
user1,pass1
user2,pass2
user3,pass3
EOF
# Create simulation with feeder
cat > user-files/simulations/DataDrivenTest.scala << 'EOF'
import io.gatling.core.Predef._
import io.gatling.http.Predef._
class DataDrivenTest extends Simulation {
val httpProtocol = http.baseUrl("https://api.example.com")
val feeder = csv("users.csv").circular
val scn = scenario("Login Test")
.feed(feeder)
.exec(http("Login")
.post("/login")
.body(StringBody("""{"username":"${username}","password":"${password}"}"""))
.check(status.is(200)))
setUp(scn.inject(atOnceUsers(10))).protocols(httpProtocol)
}
EOF
# Run test
gatling.sh -s DataDrivenTest
Best Practices¶
-
Geeignete Lastprofile verwenden: Mit gradueller Steigerung (
rampUsers) beginnen, anstattatOnceUsers, um realistische Verkehrsmuster zu simulieren und das System nicht sofort zu überlasten -
Realistische Timeouts festlegen: Verbindungs- und Anfrage-Timeouts basierend auf Ihren SLAs konfigurieren (z.B.
Would you like me to fill in the remaining placeholders with specific translations?requestTimeout = 30000für 30 Sekunden), um Leistungsprobleme frühzeitig zu erkennen
-
Implementieren Sie Korrekte Assertions: Fügen Sie Assertions hinzu, um Tests automatisch fehlschlagen zu lassen, wenn die Leistung nachlässt (
global.responseTime.percentile3.lt(2000)stellt sicher, dass das 95. Perzentil unter 2 Sekunden liegt) -
Verwenden Sie Feeder für dynamische Daten: Nutzen Sie CSV, JSON oder benutzerdefinierte Feeder anstelle von hartcodierten Testdaten, um das Verhalten echter Benutzer zu simulieren und Cache-Treffer zu vermeiden
-
Weisen Sie ausreichend Speicher zu: Erhöhen Sie bei groß angelegten Tests die JVM-Heap-Größe (
-Xms4G -Xmx8G), um OutOfMemory-Fehler zu verhindern und eine reibungslose Ausführung zu gewährleisten -
Überwachen Sie Systemressourcen: Beobachten Sie CPU-, Speicher- und Netzwerkauslastung sowohl auf dem Lastgenerator als auch auf dem Zielsystem während der Tests, um Engpässe genau zu identifizieren
-
Führen Sie Tests aus einer produktionsähnlichen Umgebung aus: Führen Sie Lasttests aus einer Infrastruktur aus, die der Produktionsumgebung ähnelt (Netzwerklatenz, Bandbreite), um genaue Ergebnisse zu erhalten
-
Versionskontrolle Ihrer Simulationen: Speichern Sie Simulationscode in Git neben dem Anwendungscode, um Änderungen zu verfolgen und Zusammenarbeit zu ermöglichen
-
Trennen Sie Anliegen mit Szenarien: Unterteilen Sie komplexe Tests in mehrere Szenarien und Ketten für bessere Wartbarkeit und Wiederverwendbarkeit
-
Analysieren Sie Berichte gründlich: Überprüfen Sie nicht nur Antwortzeiten - untersuchen Sie Anforderungsverteilung, Fehlerraten und Antworzeitperzentile, um das vollständige Leistungsbild zu verstehen
Fehlersuche¶
| Problem | Lösung |
|---|---|
| OutOfMemoryError during test execution | Increase JVM heap size: JAVA_OPTS="-Xms4G -Xmx8G" gatling.sh -s MySimulation or reduce concurrent users |
| "Simulation class not found" error | Ensure simulation is in user-files/simulations/ and class name matches file name. Recompile if needed: mvn clean compile |
| Connection timeout errors | Increase timeout in gatling.conf: gatling.http.connectTimeout = 30000 or check network connectivity to target system |
| SSL/TLS certificate errors | Disable certificate validation in simulation: .disableCaching.disableWarmUp.shareConnections.silentResources or add certificate to Java keystore |
| Recorder proxy not working | Überprüfen Sie die Browser-Proxy-Einstellungen (localhost:8000), stellen Sie sicher, dass der Recorder läuft, und verifizieren Sie, dass kein anderer Proxy/VPN interferiert |
| Reports not generating | Überprüfen Sie den Festplattenspeicher, verifizieren Sie Schreibberechtigungen im Ergebnisverzeichnis, stellen Sie sicher, dass der Test erfolgreich ohne Abstürze abgeschlossen wurde |
| High response times on load generator | Load Generator ist überlastet—reduzieren Sie gleichzeitige Benutzer, erhöhen Sie Ressourcen oder verwenden Sie verteiltes Testen mit mehreren Generatoren |
| "Too many open files" error (Linux) | Increase file descriptor limit: ulimit -n 65536 before running Gatling, or add to /etc/security/limits.conf |
| Simulations compile but don't run | Überprüfen Sie Syntaxfehler im Scala-Code, verifizieren Sie alle Importe, stellen Sie die Kompatibilität der Gatling-Version sicher |
| Maven/Gradle plugin not found | Update plugin version in pom.xml/build.gradle, run mvn clean install or gradle clean build, check Maven Central connectivity |
| Inconsistent results between runs | Zielsystem zuerst aufwärmen, konsistente Testumgebung sicherstellen, externe Faktoren prüfen (anderer Verkehr, geplante Jobs) |
| WebSocket connection failures | Verify WebSocket protocol in simulation: .ws("Connect").connect("/socket"), check target server WebSocket support |
| Feeder file not found | Place CSV/JSON files in user-files/resources/, use relative path: csv("data.csv") not absolute path |
| Docker container exits immediately | Mount volumes correctly: -v $(pwd)/user-files:/opt/gatling/user-files, ensure simulation files exist in mounted directory |
| ## Schnellreferenz: Last-Injektionsprofile |
// Immediate load
atOnceUsers(100)
// Gradual ramp-up
rampUsers(100) during (60 seconds)
// Constant rate
constantUsersPerSec(20) during (5 minutes)
// Gradual rate increase
rampUsersPerSec(10) to 50 during (2 minutes)
// Staircase pattern
incrementUsersPerSec(5)
.times(5)
.eachLevelLasting(30 seconds)
.separatedByRampsLasting(10 seconds)
.startingFrom(10)
// Complex scenario
nothingFor(5 seconds),
atOnceUsers(10),
rampUsers(50) during (30 seconds),
constantUsersPerSec(20) during (60 seconds)
Nützliche Dateispeicherorte¶
| Pfad | Beschreibung |
|---|---|
user-files/simulations/ |
Simulation Scala Dateien |
user-files/resources/ |
Feeder-Datendateien (CSV, JSON) |
user-files/bodies/ |
Anforderungskörper-Vorlagen |
results/ |
Generierte HTML-Berichte |
conf/gatling.conf |
Hauptkonfigurationsdatei |
conf/logback.xml |
Logging-Konfiguration |
target/gatling/ |
Maven Build-Ausgabe und Berichte |