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 |
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" |
Imposta host non proxy |
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 |