Repository dedicato ai test di performance della piattaforma "computerized list of household appliances".
Questa guida descrive come utilizzare la pipeline Azure DevOps definita in .devops/k6-performance-generic.yml. Tutte le variabili e gli esempi fanno riferimento a quella pipeline e allo script di orchestrazione .devops/scripts/run_k6.py.
- Build: la pipeline compila il binario personalizzato
xk6(templatetemplates/xk6-build.yml) solo quando la cache è assente, così i run successivi riutilizzano l'eseguibile e i risultati restano confrontabili tra ambienti. - Esecuzione: ogni percorso elencato nella variabile
SCRIPTS_TO_EXECUTEviene lanciato tramitepython3 .devops/scripts/run_k6.py, che convalida i parametri, prepara le variabiliK6PERF_*e avvia./xk6 runaffidando agli script k6 la lettura della configurazione. - Risultati: la cartella
results/contiene gli output aggregati e viene pubblicata come artifact a fine job per analisi successive o per estrazioni manuali.
- Il job
xk6Build(templatetemplates/xk6-build.yml) compilaxk6e memorizza i binari nella cache condivisa ($(xk6CacheKey)). - Il job
PerformanceTestseleziona l'agent pool in base aTARGET_ENV(dev,uat,prod) e prepara l'ambiente di esecuzione. - Per ogni script elencato in
SCRIPTS_TO_EXECUTEviene eseguitopython3 .devops/scripts/run_k6.py --script <percorso>, alimentato dai parametri dichiarati nel file di pipeline. - Al termine, la directory
results/viene pubblicata tramitePublishPipelineArtifact@1.
Regola generale: i valori numerici pari a 0 (
0,0s,0.0) disattivano il parametro corrispondente. Lo script.devops/scripts/run_k6.pyinterrompe l'esecuzione quando uno scenario non riceve i requisiti minimi, prevenendo run con carichi errati.
| Parametro | Descrizione | Obbligatorio per | Ignorato quando | Note pratiche | Errori / conflitti |
|---|---|---|---|---|---|
K6_SCRIPT_PATH |
Percorso relativo allo script k6 da eseguire. | Tutti gli scenari. | Mai. | Deve esistere nel repository; il runner stampa il comando completo per facilitarne il debug. | Percorso inesistente → il job termina con errore prima di invocare k6. |
TARGET_ENV |
Ambiente di destinazione (configurazione URL, credenziali, agent pool). | Tutti gli scenari. | Mai. | Valori ammessi: dev, uat, prod. Controlla i tag usati nei report e l'agent pool selezionato. |
Valori fuori elenco o variabili d'ambiente mancanti fanno fallire il run lato infrastruttura. |
K6PERF_SCENARIO_TYPE |
Executor k6 da utilizzare. | Tutti gli scenari. | Mai. | Valori ammessi: manual, shared-iterations, per-vu-iterations, constant-vus, ramping-vus, constant-arrival-rate, ramping-arrival-rate. |
Valore non ammesso → lo script si interrompe elencando tutti gli executor supportati. |
K6PERF_STAGES |
Sequenza di rampe (lista di oggetti {duration,target}). |
ramping-vus, ramping-arrival-rate. |
Scenari diversi da quelli ramping; lo script ripulisce la variabile. | Può essere definito in YAML o JSON; la pipeline la serializza in K6PERF_STAGES_JSON consumata dagli script k6 tramite __ENV. |
Scenario ramping senza stage validi → errore; valori non numerici vengono scartati e la lista vuota causa stop. |
K6PERF_DURATION |
Durata complessiva del test letta dagli script k6. | manual (se non si usano iterazioni), constant-vus, constant-arrival-rate; fallback di sicurezza per i ramping. |
Quando gli stage coprono l'intera timeline oppure in scenari puramente a iterazioni (shared-iterations, per-vu-iterations). |
Impostarlo anche nei ramping mantiene un kill switch; 0s equivale a parametro disattivo. |
Assenza del valore in scenari che lo richiedono → errore; con constant-vus non può coesistere con K6PERF_ITERATIONS. |
K6PERF_VUS |
Numero di virtual user da mantenere attivi. | manual, shared-iterations, per-vu-iterations, constant-vus. |
constant-arrival-rate e ramping-arrival-rate; se valorizzato con questi executor viene ignorato. |
Definisce la concorrenza base; scegliendo scenari VU/iterazione l'helper Python elimina eventuali K6PERF_PRE_ALLOCATED_VUS/K6PERF_MAX_VUS incompatibili. |
manual richiede K6PERF_VUS>0 e almeno uno tra K6PERF_DURATION e K6PERF_ITERATIONS; constant-vus con K6PERF_ITERATIONS>0 genera errore. |
K6PERF_MAX_VUS |
Limite superiore di virtual user che k6 può allocare. | constant-arrival-rate, ramping-arrival-rate. |
Scenari basati su VU o iterazioni; con questi executor lo script rimuove K6PERF_MAX_VUS (insieme a K6PERF_PRE_ALLOCATED_VUS). |
Fornisce margine per l'autoscaling: impostarlo ≥ K6PERF_PRE_ALLOCATED_VUS evita warning insufficient VUs. |
Valore 0 in scenari a tasso di arrivo → errore; se < K6PERF_PRE_ALLOCATED_VUS il run viene interrotto. |
K6PERF_PRE_ALLOCATED_VUS |
Pool iniziale di virtual user riservati. | constant-arrival-rate, ramping-arrival-rate. |
Scenari VU-based o iteration-based; lo script la cancella quando K6PERF_VUS governa l'esecuzione. |
Impostarlo leggermente sopra il plateau previsto stabilizza il rate e riduce cold start. | Valore 0 in scenari a tasso di arrivo → errore; se K6PERF_MAX_VUS < K6PERF_PRE_ALLOCATED_VUS il job fallisce. |
K6PERF_START_VUS |
Numero di virtual user da cui parte la rampa. | ramping-vus. |
Tutti gli altri scenari, inclusi i ramping a tasso di arrivo. | Deve essere coerente con il primo elemento di K6PERF_STAGES; se omesso gli stage vengono comunque convertiti ma k6 non può partire. |
ramping-vus con K6PERF_START_VUS <= 0 → errore. |
K6PERF_RATE |
Iterazioni per unità di tempo. | constant-arrival-rate. |
Scenari VU-based o iteration-based; negli scenari ramping-arrival-rate sono i target degli stage a governare il rate. |
Usare insieme a K6PERF_TIME_UNIT; lasciare 0 nei run ramping dove i target sono definiti negli stage. |
constant-arrival-rate con K6PERF_RATE <= 0 → errore. |
K6PERF_TIME_UNIT |
Unità di tempo per interpretare K6PERF_RATE o gli stage a tasso di arrivo. |
constant-arrival-rate, ramping-arrival-rate. |
Scenari VU-based o iteration-based; l'helper Python elimina la variabile d'ambiente. | Valori tipici: 1s, 500ms. Per scenari ramping-arrival-rate deve essere coerente con target (richieste per unità). |
Assenza in scenari a tasso di arrivo → errore. |
K6PERF_RPS |
Limite globale alle richieste al secondo. | Nessuno (opzionale). | Mai (con valore 0 il limite è disattivato). | Agisce come safety net per proteggere ambienti condivisi; può essere combinato con qualsiasi scenario. | Valore troppo basso può troncare il test anticipatamente ma non genera errori di validazione. |
K6PERF_ITERATIONS |
Numero totale di iterazioni da completare. | shared-iterations, per-vu-iterations; opzionale per manual. |
constant-vus, ramping-vus, constant-arrival-rate, ramping-arrival-rate. |
In per-vu-iterations ogni VU esegue K6PERF_ITERATIONS / K6PERF_VUS; nel manuale permette run limitati senza durata. |
Valore 0 in scenari a iterazioni → errore; valore >0 con scenari non supportati (eccetto manual) → errore. |
- Scenari a iterazioni (
shared-iterations,per-vu-iterations): richiedonoK6PERF_ITERATIONSeK6PERF_VUS; ignoranoK6PERF_RATE,K6PERF_TIME_UNITeK6PERF_STAGES. - Scenari basati sui VU (
manual,constant-vus,ramping-vus): utilizzanoK6PERF_VUS; nelle rampe sono obbligatoriK6PERF_START_VUSeK6PERF_STAGES.K6PERF_MAX_VUSeK6PERF_PRE_ALLOCATED_VUSvengono rimossi. - Scenari a tasso di arrivo (
constant-arrival-rate,ramping-arrival-rate): richiedonoK6PERF_PRE_ALLOCATED_VUSeK6PERF_MAX_VUS, ignoranoK6PERF_VUS. K6PERF_RPSè indipendente e applicabile a qualunque scenario.
-
manual
- Obiettivo: eseguire rapidamente uno script senza affidarsi a un executor k6 predefinito, utile per debug locale o verifiche preliminari.
- Parametri minimi:
K6PERF_SCENARIO_TYPE=manual,K6PERF_VUS>0, piùK6PERF_DURATIONoK6PERF_ITERATIONS. - Esempio:
TARGET_ENV=uat K6PERF_SCENARIO_TYPE=manual K6PERF_VUS=50 K6PERF_DURATION=2m python3 .devops/scripts/run_k6.py --script pdvPerformance.js.
-
shared-iterations
- Obiettivo: misurare quanto rapidamente un gruppo di VU completa un numero fisso di transazioni, evidenziando regressioni di throughput o latenza.
- Parametri minimi:
K6PERF_SCENARIO_TYPE=shared-iterations,K6PERF_ITERATIONS>0,K6PERF_VUS>0;K6PERF_DURATIONrimane un limite di sicurezza. - Esempio:
TARGET_ENV=uat K6PERF_SCENARIO_TYPE=shared-iterations K6PERF_ITERATIONS=20000 K6PERF_VUS=100 K6PERF_DURATION=10m python3 .devops/scripts/run_k6.py --script pdvPerformance.js.
-
per-vu-iterations
- Obiettivo: assicurare che ogni VU ripeta lo stesso volume di iterazioni, facendo emergere problemi che compaiono dopo il warm-up o con cache per-utente.
- Parametri minimi:
K6PERF_SCENARIO_TYPE=per-vu-iterations,K6PERF_ITERATIONS>0,K6PERF_VUS>0,K6PERF_DURATIONcome guard rail. - Esempio:
TARGET_ENV=uat K6PERF_SCENARIO_TYPE=per-vu-iterations K6PERF_ITERATIONS=10000 K6PERF_VUS=100 K6PERF_DURATION=10m python3 .devops/scripts/run_k6.py --script pdvPerformance.js.
-
constant-vus
- Obiettivo: mantenere costante la concorrenza per osservare lo steady state dell'applicazione o eseguire soak test brevi.
- Parametri minimi:
K6PERF_SCENARIO_TYPE=constant-vus,K6PERF_VUS>0,K6PERF_DURATION;K6PERF_RPSopzionale come limite superiore. - Esempio:
TARGET_ENV=uat K6PERF_SCENARIO_TYPE=constant-vus K6PERF_VUS=1000 K6PERF_DURATION=10m K6PERF_RPS=5000 python3 .devops/scripts/run_k6.py --script pdvPerformance.js.
-
ramping-vus
- Obiettivo: modellare una crescita o una riduzione controllata del numero di VU attivi.
- Parametri minimi:
K6PERF_SCENARIO_TYPE=ramping-vus,K6PERF_START_VUS>0,K6PERF_STAGEScon coppieduration/target;K6PERF_DURATIONfacoltativo. - Esempio:
TARGET_ENV=uat K6PERF_SCENARIO_TYPE=ramping-vus K6PERF_START_VUS=100 K6PERF_STAGES='[{"duration":"3m","target":100},{"duration":"4m","target":1000},{"duration":"3m","target":0}]' python3 .devops/scripts/run_k6.py --script pdvPerformance.js.
-
constant-arrival-rate
- Obiettivo: mantenere costante il numero di iterazioni per unità di tempo, indipendentemente dal tempo che ogni VU impiega a completarle.
- Parametri minimi:
K6PERF_SCENARIO_TYPE=constant-arrival-rate,K6PERF_RATE>0,K6PERF_TIME_UNIT,K6PERF_PRE_ALLOCATED_VUS>0,K6PERF_MAX_VUS>=K6PERF_PRE_ALLOCATED_VUS,K6PERF_DURATION. - Esempio:
TARGET_ENV=uat K6PERF_SCENARIO_TYPE=constant-arrival-rate K6PERF_RATE=400 K6PERF_TIME_UNIT=1s K6PERF_PRE_ALLOCATED_VUS=100 K6PERF_MAX_VUS=1000 K6PERF_DURATION=10m python3 .devops/scripts/run_k6.py --script pdvPerformance.js.
-
ramping-arrival-rate
- Obiettivo: variare il tasso di arrivo per simulare lanci progressivi o picchi improvvisi, consentendo a k6 di espandere il pool.
- Parametri minimi:
K6PERF_SCENARIO_TYPE=ramping-arrival-rate,K6PERF_STAGEScon target di arrivo,K6PERF_TIME_UNIT,K6PERF_PRE_ALLOCATED_VUS>0,K6PERF_MAX_VUS>0. - Esempio:
TARGET_ENV=uat K6PERF_SCENARIO_TYPE=ramping-arrival-rate K6PERF_STAGES='[{"duration":"2m","target":100},{"duration":"5m","target":1000},{"duration":"3m","target":1000}]' K6PERF_TIME_UNIT=1s K6PERF_PRE_ALLOCATED_VUS=100 K6PERF_MAX_VUS=1000 python3 .devops/scripts/run_k6.py --script pdvPerformance.js.
-
Piatto stabile a 1000 VU per 10 minuti
- Scenario:
constant-vus - Parametri consigliati:
K6PERF_VUS=1000,K6PERF_DURATION=10m,K6PERF_RPS=5000(opzionale),TARGET_ENV=uat - Risultato atteso: verifica che l'ambiente sostenga 1000 utenti virtuali simultanei per tutta la durata, mantenendo latenza e errori entro le soglie definite.
- Scenario:
-
Rampa controllata 100 -> 1000 VU in 10 minuti
- Scenario:
ramping-vus - Parametri consigliati:
K6PERF_START_VUS=100,TARGET_ENV=uat; lasciareK6PERF_DURATIONdisattivato (0s) così la durata totale coincide con la somma degli stage K6PERF_STAGES:[{"duration":"3m","target":100},{"duration":"4m","target":1000},{"duration":"3m","target":0}]- Risultato atteso: osserva come il sistema scala mentre la concorrenza cresce fino a 1000 VU e poi torna a zero in modo controllato.
- Scenario:
-
Spike improvviso a 1000 richieste/s sostenuto per 8 minuti
- Scenario:
ramping-arrival-rate - Parametri consigliati:
K6PERF_TIME_UNIT=1s,K6PERF_PRE_ALLOCATED_VUS=1000,K6PERF_MAX_VUS=1000,K6PERF_RPS=5000,TARGET_ENV=uat K6PERF_STAGES:[{"duration":"1m","target":100},{"duration":"1m","target":1000},{"duration":"8m","target":1000}]- Risultato atteso: valida la resilienza del sistema quando il carico passa da 100 a 1000 richieste al secondo in modo repentino e rimane al picco.
- Scenario:
-
Plateau costante a 1000 richieste/s per 15 minuti
- Scenario:
constant-arrival-rate - Parametri consigliati:
K6PERF_RATE=1000,K6PERF_TIME_UNIT=1s,K6PERF_PRE_ALLOCATED_VUS=900,K6PERF_MAX_VUS=1200,K6PERF_DURATION=15m,TARGET_ENV=uat - Risultato atteso: conferma che l'infrastruttura mantiene 1000 iterazioni al secondo con sufficiente margine di VU per assorbire code e ritardi temporanei.
- Scenario:
-
Smoke test di throughput (1000 iterazioni entro 2 minuti)
- Scenario:
shared-iterations - Parametri consigliati:
K6PERF_ITERATIONS=1000,K6PERF_VUS=100,K6PERF_DURATION=2m,TARGET_ENV=uat - Risultato atteso: 100 VU completano le 1000 iterazioni entro 120 secondi; se il tempo aumenta l'espansione a 1000 VU potrebbe non essere sostenibile.
- Scenario:
-
Stress progressivo oltre la soglia (1000 -> 1200 richieste/s)
- Scenario:
ramping-arrival-rate - Parametri consigliati:
K6PERF_TIME_UNIT=1s,K6PERF_PRE_ALLOCATED_VUS=1000,K6PERF_MAX_VUS=1300,TARGET_ENV=uat K6PERF_STAGES:[{"duration":"4m","target":600},{"duration":"4m","target":1000},{"duration":"4m","target":1200}]- Risultato atteso: individua il punto in cui il sistema inizia a degradare oltre la soglia di riferimento (1000 richieste/s), fornendo indicazioni sui trigger per meccanismi di autoscaling o throttling.
- Scenario: