Apache JMeter Cheatsheet
Apache JMeter Cheatsheet
Installazione
| Piattaforma | Comando |
|---|---|
| Ubuntu/Debian | sudo apt update && sudo apt install jmeter |
| Ubuntu (Snap) | sudo snap install jmeter |
| macOS (Homebrew) | brew install jmeter |
| Windows (Chocolatey) | choco install jmeter |
| Binary (Linux/macOS) | wget https://dlcdn.apache.org//jmeter/binaries/apache-jmeter-5.6.3.tgz && tar -xzf apache-jmeter-5.6.3.tgz |
| Docker | docker pull justb4/jmeter:latest |
| Prerequisites | Java JDK 8+ required: java -version |
# Add JMeter to PATH (Linux/macOS)
export JMETER_HOME=/opt/apache-jmeter-5.6.3
export PATH=$PATH:$JMETER_HOME/bin
# Verify installation
jmeter --version
# Increase heap size (add to ~/.bashrc or jmeter startup script)
export JVM_ARGS="-Xms1g -Xmx4g"
Comandi Base
| Comando | Descrizione |
|---|---|
jmeter | Avvia GUI JMeter |
jmeter -t test-plan.jmx | Aprire il piano di test specifico nell’interfaccia grafica |
jmeter -n -t test.jmx -l results.jtl | Esegui test in modalità non-GUI con risultati |
jmeter -n -t test.jmx -l results.jtl -e -o report/ | Esegui test e genera dashboard HTML |
jmeter --version or jmeter -v | Visualizza versione JMeter |
jmeter --help or jmeter -h | Mostra help e opzioni disponibili |
jmeter -? | Elenca tutte le proprietà disponibili |
jmeter -n -t test.jmx -j jmeter.log | Esegui test con file di log personalizzato |
jmeter -g results.jtl -o dashboard/ | Genera report HTML dai risultati esistenti |
jmeter -p custom.properties | Avvia con file di proprietà personalizzato |
jmeter -Xmx4g | Avvia con dimensione heap aumentata (4GB) |
jmeter-server | Avvia JMeter in modalità server per test distribuiti |
jmeter -n -t test.jmx -l results.csv | Esegui test e salva i risultati come CSV |
jmeter -n -t test.jmx -l results.xml | Esegui test e salva i risultati come XML |
jmeter -Jusers=100 | Sovrascrivi il valore della proprietà durante l’esecuzione |
Utilizzo Avanzato
| Comando | Descrizione |
|---|---|
jmeter -n -t test.jmx -r | Esegui test su tutti i server remoti |
jmeter -n -t test.jmx -R server1:1099,server2:1099 | Esegui test su specifici server remoti |
jmeter -n -t test.jmx -Gusers=100 -Grampup=60 | Imposta proprietà globali per server remoti |
jmeter -n -t test.jmx -r -X | Esegui test distribuiti ed esci dai server remoti dopo |
jmeter -n -t test.jmx -q env.properties -q users.properties | Utilizzare più file di proprietà |
jmeter -H proxy.example.com -P 8080 | Esegui con proxy HTTP |
jmeter -H proxy.com -P 8080 -u username -a password | Esegui con proxy autenticato |
jmeter -Lorg.apache.jmeter=DEBUG | Imposta il livello di log a DEBUG |
jmeter -Lorg.apache.jmeter.protocol.http=DEBUG | Imposta il livello di log per un pacchetto specifico |
jmeter-server -Djava.rmi.server.hostname=192.168.1.100 | Avvia server con hostname specifico |
jmeter-server -Dserver_port=1099 | Avvia server su porta personalizzata |
jmeter -n -t test.jmx -Jsummariser.interval=30 | Imposta l’intervallo di riepilogo a 30 secondi |
jmeter -n -t test.jmx -Jjmeter.save.saveservice.output_format=xml | Forza formato di output XML |
jmeter -n -t test.jmx -Jjmeter.save.saveservice.response_data=true | Includere i dati di risposta nei risultati |
jmeter -XX:+UseG1GC -n -t test.jmx | Esegui con il garbage collector G1 |
jmeter -Dcom.sun.management.jmxremote -n -t test.jmx | Abilitare il monitoraggio JMX |
jmeter -Dhttp.keepAlive=false -n -t test.jmx | Disabilita HTTP keep-alive |
jmeter -g results.jtl -o dashboard/ -f | Forza sovrascrittura dashboard esistente |
| `jmeter -N “localhost | *.internal.com”` |
PluginsManagerCMD.sh install jpgc-casutg,jpgc-synthesis | Installa i plugin di JMeter tramite CLI |
Configurazione
File delle Proprietà di JMeter (jmeter.properties)
# Thread and ramp-up settings
jmeter.threads=100
jmeter.rampup=60
# Remote server configuration
remote_hosts=server1:1099,server2:1099,server3:1099
# Result file configuration
jmeter.save.saveservice.output_format=csv
jmeter.save.saveservice.response_data=false
jmeter.save.saveservice.samplerData=false
jmeter.save.saveservice.requestHeaders=false
jmeter.save.saveservice.url=true
jmeter.save.saveservice.responseHeaders=false
# HTTP settings
httpclient.reset_state_on_thread_group_iteration=true
http.keepAlive=true
http.connection.timeout=30000
http.socket.timeout=120000
# Summariser interval (seconds)
summariser.interval=30
# Log level
log_level.jmeter=INFO
log_level.jmeter.engine=DEBUG
File delle Proprietà Utente (user.properties)
# Custom variables
baseurl=https://example.com
users=100
rampup=60
duration=300
# Environment-specific settings
env=production
api_key=your_api_key_here
Proprietà di Sistema
# Set system properties via command line
jmeter -Dhttp.proxyHost=proxy.example.com \
-Dhttp.proxyPort=8080 \
-Dhttps.proxyHost=proxy.example.com \
-Dhttps.proxyPort=8080 \
-n -t test.jmx
Configurazione JVM (jmeterscript)
# Edit JMETER_HOME/bin/jmeter or set environment variable
export HEAP="-Xms1g -Xmx4g -XX:MaxMetaspaceSize=256m"
export GC_ALGO="-XX:+UseG1GC -XX:MaxGCPauseMillis=100 -XX:G1ReservePercent=20"
export JVM_ARGS="$HEAP $GC_ALGO"
Configurazione Test Distribuiti
# In jmeter.properties on controller machine
remote_hosts=192.168.1.101:1099,192.168.1.102:1099,192.168.1.103:1099
# Server RMI configuration
server.rmi.ssl.disable=true
server.rmi.localport=4000
server_port=1099
# On remote server machines
java.rmi.server.hostname=192.168.1.101
Casi d’Uso Comuni
Caso d’Uso 1: Test di Carico Base con Report HTML
# Run load test with 100 users, 60s ramp-up, generate HTML report
jmeter -n -t load-test.jmx \
-Jusers=100 \
-Jrampup=60 \
-Jduration=300 \
-l results/results.jtl \
-e -o results/dashboard/ \
-j results/jmeter.log
# View the report
open results/dashboard/index.html # macOS
xdg-open results/dashboard/index.html # Linux
Caso d’Uso 2: Test di Carico Distribuito su Più Server
# Step 1: Start JMeter servers on remote machines
# On server1 (192.168.1.101):
jmeter-server -Djava.rmi.server.hostname=192.168.1.101
# On server2 (192.168.1.102):
jmeter-server -Djava.rmi.server.hostname=192.168.1.102
# Step 2: Run distributed test from controller
jmeter -n -t distributed-test.jmx \
-R 192.168.1.101:1099,192.168.1.102:1099 \
-Gusers=500 \
-Grampup=120 \
-l distributed-results.jtl \
-e -o distributed-report/
# Step 3: Shutdown remote servers
jmeter -n -t distributed-test.jmx -R 192.168.1.101:1099,192.168.1.102:1099 -X
Caso d’Uso 3: Test di Prestazioni API con Più Ambienti
# Create environment-specific property files
# dev.properties:
echo "baseurl=https://dev-api.example.com" > dev.properties
echo "api_key=dev_key_123" >> dev.properties
# prod.properties:
echo "baseurl=https://api.example.com" > prod.properties
echo "api_key=prod_key_456" >> prod.properties
# Run test against dev environment
jmeter -n -t api-test.jmx \
-q dev.properties \
-Jusers=50 \
-l dev-results.jtl \
-e -o dev-report/
# Run test against production environment
jmeter -n -t api-test.jmx \
-q prod.properties \
-Jusers=200 \
-l prod-results.jtl \
-e -o prod-report/
Caso d’Uso 4: Integrazione CI/CD (Jenkins/GitLab)
#!/bin/bash
# performance-test.sh - CI/CD pipeline script
# Set variables
TEST_PLAN="test-plans/load-test.jmx"
RESULTS_DIR="results/$(date +%Y%m%d_%H%M%S)"
USERS=${USERS:-100}
DURATION=${DURATION:-300}
# Create results directory
mkdir -p $RESULTS_DIR
# Run JMeter test
jmeter -n -t $TEST_PLAN \
-Jusers=$USERS \
-Jduration=$DURATION \
-l $RESULTS_DIR/results.jtl \
-e -o $RESULTS_DIR/dashboard/ \
-j $RESULTS_DIR/jmeter.log
# Check for errors (exit code)
if [ $? -eq 0 ]; then
echo "Test completed successfully"
# Archive results
tar -czf $RESULTS_DIR.tar.gz $RESULTS_DIR
# Optional: Upload to artifact storage
# aws s3 cp $RESULTS_DIR.tar.gz s3://bucket/results/
else
echo "Test failed with errors"
exit 1
fi
Caso d’Uso 5: Test di Prestazioni Database
# Test database performance with parameterized queries
jmeter -n -t database-test.jmx \
-Jdb.host=db.example.com \
-Jdb.port=5432 \
-Jdb.name=testdb \
-Jdb.user=testuser \
-Jdb.password=testpass \
-Jthreads=50 \
-Jrampup=30 \
-l db-results.jtl \
-e -o db-report/
# Generate report from existing results
jmeter -g db-results.jtl -o db-report-regenerated/
Migliori Pratiche
-
Utilizzare sempre la modalità non-GUI per i test effettivi: La modalità GUI consuma risorse significative e influisce sull’accuratezza del test. Utilizzare
jmeter -nper tutti i test di prestazioni. -
Allocare memoria heap sufficiente: Impostare la dimensione dell’heap JVM ad almeno il 25% della RAM disponibile. Per test di grandi dimensioni:
export JVM_ARGS="-Xms2g -Xmx4g -XX:+UseG1GC" -
Utilizzare il formato CSV per i file dei risultati: Il formato CSV è più efficiente di XML. Disabilitare la raccolta di dati non necessari per ridurre l’overhead:
jmeter.save.saveservice.response_data=false -
Implementare periodi di ramp-up appropriati: Evitare di avviare tutti i thread contemporaneamente. Utilizzare un ramp-up graduale (tipicamente 10-20% della durata del test) per simulare pattern di carico realistici.
-
Sfruttare test distribuiti per carichi elevati: Le limitazioni di una singola macchina possono distorcere i risultati. Utilizzare più server JMeter per test che superano 500-1000 thread.
-
Parametrizzare i dati di test: Utilizzare CSV Data Set Config o variabili invece di valori hardcoded. Questo consente una facile configurazione del test e il cambio di ambiente.
-
Monitorare le risorse di sistema durante i test: Tracciare CPU, memoria, rete e I/O del disco sia sulle macchine JMeter che sui sistemi target. Un utilizzo elevato delle risorse su JMeter indica colli di bottiglia nell’esecuzione del test.
-
Utilizzare il version control per i piani di test: Archiviare
.jmxfile e file di proprietà in Git. Utilizzare messaggi di commit significativi e taggare i rilasci per la riproducibilità. -
Implementare correlazione e asserzioni appropriate: Estrarre valori dinamici (token, ID di sessione) e convalidare le risposte. Non misurare solo la velocità—verificare la correttezza.
-
Pulire tra le esecuzioni dei test: Cancellare directory dei risultati e log. Ripristinare lo stato dell’applicazione quando necessario per garantire condizioni di test coerenti.
Risoluzione dei problemi
| Problema | Soluzione |
|---|---|
| OutOfMemoryError during test | Increase heap size: export JVM_ARGS="-Xms2g -Xmx4g" or reduce threads/disable response data saving |
| Connection refused on remote servers | Check firewall rules for ports 1099 and 4000. Verify java.rmi.server.hostname is set correctly on server |
| Test results show 100% errors | Verify target URL is accessible, check proxy settings, review jmeter.log for detailed error messages |
| GUI freezes during large tests | Never run large tests in GUI mode. Use non-GUI: jmeter -n -t test.jmx -l results.jtl |
| Inconsistent results between runs | Assicurarsi di eseguire un corretto ramp-up, pulire la cache/cookies tra le esecuzioni, verificare la stabilità della rete, controllare il carico del sistema target |
| Cannot generate HTML report | Verify results file format is compatible (CSV/JTL), ensure output directory is empty or use -f flag to force overwrite |
| Remote servers not starting | Check Java version compatibility (JDK 8+), verify RMI registry port is available, review jmeter-server.log |
| SSL/TLS certificate errors | Add certificate to Java keystore or disable validation: jmeter -Jhttps.default.protocol=TLSv1.2 |
| Slow test execution | Disabilitare i listener in modalità non-GUI, ridurre la complessità delle asserzioni, ottimizzare le espressioni regolari, utilizzare estrattori efficienti |
| ”Non HTTP response code: java.net.SocketException” | Aumentare i valori di timeout, verificare le impostazioni del connection pool, controllare la capacità del sistema di destinazione, ridurre il conteggio dei thread |
| Distributed test results incomplete | Assicurarsi che tutti i server abbiano la stessa versione del test plan, verificare la connettività di rete, controllare la sincronizzazione dell’orologio tra i server |
| High CPU on JMeter machine | Riduci il numero di thread, disabilita processori/listener non necessari, utilizza campionatori più semplici, considera il testing distribuito |
| Cannot install plugins | Download Plugins Manager JAR manually to lib/ext/, ensure internet connectivity, check proxy settings |
| Results file corrupted or empty | Assicurarsi di avere spazio su disco sufficiente, verificare i permessi dei file, controllare che il processo JMeter sia stato completato correttamente |
| ”Address already in use” error | Change server port: jmeter-server -Dserver_port=1100, kill existing JMeter processes, wait for port release |
Riferimento rapido: Opzioni della riga di comando
| Opzione | Descrizione | Esempio |
|---|---|---|
-n | Modalità non-GUI | jmeter -n -t test.jmx |
-t | File del piano di test | jmeter -t mytest.jmx |
-l | File di registro dei risultati | jmeter -n -t test.jmx -l results.jtl |
-j | File di log JMeter | jmeter -n -t test.jmx -j jmeter.log |
-r | Esegui su tutti i server remoti | jmeter -n -t test.jmx -r |
-R | Esegui su server specifici | jmeter -n -t test.jmx -R server1,server2 |
-g | Genera report da file | jmeter -g results.jtl -o report/ |
-e | Genera report dopo test | jmeter -n -t test.jmx -l results.jtl -e -o report/ |
-o | Cartella di output per il report | jmeter -g results.jtl -o dashboard/ |
-H | Host proxy | jmeter -H proxy.com -P 8080 |
-P | Porta proxy | jmeter -H proxy.com -P 8080 |
-u | Nome utente proxy | jmeter -H proxy.com -P 8080 -u user |
-a | Password proxy | jmeter -H proxy.com -P 8080 -a pass |
-J | Definisci proprietà JMeter | jmeter -Jusers=100 -Jrampup=60 |
-G | Definisci proprietà globale | jmeter -Gusers=100 (for remote servers) |
-D | Definisci proprietà di sistema | jmeter -Dhttp.proxyHost=proxy.com |
-L | Imposta livello log | jmeter -Lorg.apache.jmeter=DEBUG |
-p | File di proprietà | jmeter -p custom.properties |
-q | File di proprietà aggiuntivo | jmeter -q env.properties |
-X | Esci dai server remoti | jmeter -n -t test.jmx -r -X |