Crea script di test per la tua piattaforma IoT
Utilizza JMeter per creare script di test per scenari di test complessi nel tuo ambiente IoT.
Nel mio articolo precedente, ho introdotto lo strumento di test open source JMeter e ho utilizzato un semplice test HTTP come esempio per dimostrarne le capacità. Questo articolo illustra come creare script di test per scenari di test complessi.
L'interfaccia utente visualizza uno script di test JMeter nel formato "albero". Lo script di test salvato (nel formato .jmx
) è XML. L'albero dello script JMeter tratta un piano di test come il nodo radice e il piano di test include tutti i componenti di test. Nel piano di test è possibile configurare variabili definite dall'utente richiamate dai componenti nell'intero piano di test. Le variabili possono anche collegare il comportamento del gruppo, i file di libreria utilizzati nel test e così via. È possibile creare scenari di test avanzati utilizzando vari componenti di test nel piano di test.
I componenti di test in JMeter hanno generalmente le seguenti categorie:
- Gruppo di discussioni
- Campionatore
- Controllore logico
- Ascoltatore
- Elemento di configurazione
- Asserzione
- Timer
- Preprocessore
- Post-processore
Gruppi di discussioni
Un gruppo di thread è il punto di inizio per tutti i piani di test (quindi tutti i campionatori e i controller devono essere posizionati in un gruppo di thread). Un gruppo di thread può essere considerato come un pool di utenti virtuali in cui ogni thread è essenzialmente un utente virtuale e più utenti virtuali eseguono simultaneamente lo stesso batch di attività. Ogni thread è indipendente e non influenza gli altri. Durante l'esecuzione di un thread, la variabile del thread corrente non influenza il valore della variabile degli altri thread.
(Chongyuan Yin, CC BY-SA 4.0)
In questa interfaccia il gruppo di thread può essere configurato in vari modi.
1. Azione da intraprendere dopo un errore del campionatore
I seguenti elementi di configurazione controllano se un test continua quando viene rilevato un errore:
- Continua: ignora gli errori e continua l'esecuzione.
- Avvia il ciclo del thread successivo: ignora l'errore, termina il ciclo corrente del thread ed esegue il ciclo successivo.
- Interrompi thread: interrompe l'esecuzione del thread corrente senza influire sulla normale esecuzione degli altri thread.
- Interrompi test: interrompe l'intero thread dopo che i thread in esecuzione hanno terminato il campionamento corrente.
- Interrompi test adesso: l'intera esecuzione del test si interrompe immediatamente, anche se interrompe l'esecuzione dei campionatori in corso.
2. Numero di thread
Questo è il numero di utenti (virtuali) simultanei. Ogni thread esegue il piano di test in modo completamente indipendente senza interferire con gli altri. Il test utilizza più thread per simulare l'accesso simultaneo al server.
3. Periodo di accelerazione
Il tempo di accelerazione imposta il tempo necessario per avviare tutti i thread. Ad esempio, se il numero di thread è impostato su 10 e il tempo di accelerazione è impostato su 100 secondi, JMeter utilizza 100 secondi per avviare ed esegue 10 thread (ogni thread inizia 10 secondi dopo l'avvio del thread precedente).
Se il valore di accelerazione è impostato su un valore basso e il numero di thread è impostato su un valore elevato, all'inizio del test c'è molto stress sul server.
4. Conteggio dei cicli
Imposta il numero di cicli per thread nel gruppo di thread prima della fine.
5. Ritarda la creazione del thread fino a quando non sarà necessario
Per impostazione predefinita, tutti i thread vengono creati all'avvio del test. Se questa opzione è selezionata, i thread vengono creati quando sono necessari.
6. Specificare la durata del thread
Controlla il tempo di esecuzione dei gruppi di thread. È possibile impostare la durata e il ritardo di avvio (in secondi).
Campionatori
Un campionatore simula le operazioni dell'utente. È un'unità in esecuzione che invia richieste al server e riceve dati di risposta dal server. Un campionatore è un componente all'interno di un gruppo di thread, quindi deve essere aggiunto al gruppo di thread. JMeter supporta nativamente una varietà di campionatori, tra cui un campionatore TCP, una richiesta HTTP, una richiesta FTP, una richiesta JDBC, una richiesta Java e così via. Ogni tipologia di campionatore invia richieste diverse al server in base ai parametri impostati.
Campionatore TCP
Il campionatore TCP si connette al server specificato tramite TCP/IP, invia un messaggio al server una volta stabilita la connessione, quindi attende la risposta del server.
(Chongyuan Yin, CC BY-SA 4.0)
Le proprietà che possono essere impostate nel campionatore TCP sono le seguenti:
Nome classe TCPClient
Rappresenta la classe di implementazione che gestisce la richiesta. Per impostazione predefinita, viene utilizzato org.apache.jmeter.protocol.tcp.sampler.TCPClientImpl
e per la trasmissione viene utilizzato il testo semplice. Inoltre, JMeter ha anche il supporto integrato per BinaryTCPClientImpl
e LengthPrefixedBinaryTCPClientImpl
. Il primo utilizza pacchetti esadecimali e il secondo aggiunge un prefisso di 2 byte di lunghezza a BinaryTCPClientImpl
.
Puoi anche fornire classi di implementazione personalizzate estendendo org.apache.jmeter.protocol.tcp.sampler.TCPClient
.
- Impostazioni del server di destinazione: Nome server o IP e Numero porta specificano il nome host o l'indirizzo IP e il numero di porta dell'applicazione server.
- Opzioni di connessione: determina la modalità di connessione al server.
- Riutilizza connessione: se abilitata, questa connessione è sempre aperta; in caso contrario, viene chiuso dopo la lettura dei dati.
- Chiudi connessione: se abilitata, questa connessione viene chiusa al termine dell'esecuzione del campionatore TCP.
- Imposta nessun ritardo: se abilitato, l'algoritmo Nagle è disabilitato e è consentito l'invio di pacchetti di piccole dimensioni.
- SO_LINGER: controlla se attendere che i dati nel buffer completino la trasmissione prima di chiudere la connessione.
- Valore byte di fine riga (EOL): determina il valore del byte alla fine della riga. Il controllo EOL viene saltato se il valore specificato è maggiore di 127 o minore di -128. Ad esempio, se una stringa restituita dal server termina con un ritorno a capo, è possibile impostare questa opzione su 10.
Campionatore di richieste HTTP
Il campionatore HTTP invia richieste HTTP e HTTPS al server web.
(Chongyuan Yin, CC BY-SA 4.0)
Ecco le impostazioni disponibili:
- Nome e commenti
- Protocollo: imposta il protocollo per inviare la richiesta al server di destinazione, che può essere HTTP, HTTPS o FILE. L'impostazione predefinita è HTTP.
- Nome server o indirizzo IP: il nome host o l'indirizzo IP del server di destinazione a cui viene inviata la richiesta.
- Numero di porta: il numero di porta su cui è in ascolto il servizio web. La porta predefinita è 80 per HTTP e 443 per HTTPS.
- Metodo di richiesta: il metodo per inviare la richiesta, che in genere include GET, POST, DELETE, PUT, TRACE, HEAD, OPTIONS e così via.
- Percorso: l'URL di destinazione (esclusi l'indirizzo del server e la porta) da richiedere.
- Codifica dei contenuti: come codificare la richiesta (applicabile a POST, PUT, PATCH e FILE).
- Opzioni di richiesta avanzate: alcune opzioni extra, tra cui:
- Reindirizzamento automatico: il reindirizzamento non viene trattato come una richiesta separata e non viene registrato da JMeter.
- Segui reindirizzamenti: ogni reindirizzamento viene trattato come una richiesta separata e viene registrato da JMeter.
- Utilizza KeepAlive: se abilitato,
Connection: keep-alive
viene aggiunto all'intestazione della richiesta quando JMeter comunica con il server di destinazione. - Utilizza multipart/form-data per POST: se abilitato, le richieste vengono inviate utilizzando
multipart/form-data o application/x-www-form-urlencoded
.
application/json
nell'intestazione della richiesta.Controllori logici
Il JMeter Logic Controller controlla la logica di esecuzione dei componenti. Il sito web JMeter lo spiega in questo modo: "I controllori logici determinano l'ordine in cui vengono elaborati i campionatori".
Il Logic Controller può controllare l'ordine di esecuzione dei campionatori. Pertanto, il controller deve essere utilizzato insieme al campionatore. Ad eccezione del controller one-only, altri controller logici possono essere nidificati l'uno nell'altro.
I controller logici in JMeter sono principalmente divisi in due categorie. Possono controllare l'ordine di esecuzione logico dei nodi durante l'esecuzione del piano di test (un loop o un controller condizionale) oppure possono agire in risposta a un throughput specifico o al conteggio delle transazioni.
Controllore delle transazioni
A volte è necessario contare il tempo di risposta complessivo di un gruppo di richieste correlate. In questo caso è necessario utilizzare un Transaction Controller.
Il Transaction Controller conta il tempo di esecuzione del campionatore di tutti i nodi figlio sotto il controller. Se sono definiti più campionatori nel controller della transazione, la transazione viene considerata riuscita solo quando tutti i campionatori vengono eseguiti correttamente.
Aggiungi un controller di transazione utilizzando il menu contestuale:
(Chongyuan Yin, CC BY-SA 4.0)
Genera campione principale: se abilitato, il Transaction Controller viene utilizzato come campione principale per altri campionatori. Altrimenti, il Transaction Controller viene utilizzato solo come campione indipendente.
(Chongyuan Yin, CC BY-SA 4.0)
Ad esempio, il rapporto di riepilogo non selezionato è il seguente:
(Chongyuan Yin, CC BY-SA 4.0)
Se selezionato, il rapporto riepilogativo sarà il seguente:
(Chongyuan Yin, CC BY-SA 4.0)
Includi durata del timer: se abilitato, includi un timer (viene aggiunto un ritardo prima e dopo l'esecuzione del campionatore).
Controller una volta sola
Il Once Only Controller, come suggerisce il nome, è un controller che viene eseguito una sola volta. La richiesta sotto il controller viene eseguita solo una volta durante il processo di esecuzione del loop nel gruppo di thread. Per i test che richiedono un accesso, puoi considerare di inserire la richiesta di accesso in un controller Once Only perché la richiesta di accesso deve essere eseguita solo una volta per stabilire una sessione.
(Chongyuan Yin, CC BY-SA 4.0)
Se imposti il conteggio dei cicli su 2 e controlli l'albero dei risultati dopo l'esecuzione, puoi vedere che la richiesta HTTP 3
sotto il controller Once Only viene eseguita solo una volta e le altre richieste vengono eseguite due volte.
(Chongyuan Yin, CC BY-SA 4.0)
Ascoltatori
Un ascoltatore è una serie di componenti che elaborano e visualizzano i dati dei risultati del test. Visualizza albero dei risultati, Risultati grafico e Rapporto aggregato sono componenti listener comuni.
Visualizza l'albero dei risultati
Questo componente visualizza il risultato, il contenuto della richiesta, il tempo di risposta, il codice di risposta e il contenuto della risposta di ciascun campionatore in una struttura ad albero. La visualizzazione delle informazioni può aiutare ad analizzare se c'è un problema. Fornisce vari formati di visualizzazione e metodi di filtraggio e può anche scrivere i risultati in file specifici per l'analisi e l'elaborazione batch.
(Chongyuan Yin, CC BY-SA 4.0)
Elemento di configurazione
L'elemento Configuration fornisce il supporto per la configurazione dei dati statici. Può essere definito a livello del piano di test, oppure a livello di gruppo di thread o campionatore, con ambiti diversi per livelli diversi. Gli elementi di configurazione includono principalmente variabili definite dall'utente, configurazione del set di dati CSV, configurazione del campionatore TCP, gestione dei cookie HTTP, ecc.
Variabili definite dall'utente
(Chongyuan Yin, CC BY-SA 4.0)
Impostando una serie di variabili, si determina l'utilizzo di una selezione casuale di valori nel test delle prestazioni. È possibile fare riferimento ai nomi delle variabili all'interno dell'ambito e alle variabili come $ {nome variabile}
.
Oltre al componente Variabili definite dall'utente, le variabili possono essere definite anche in altri componenti, come Piani di test e Richieste HTTP:
(Chongyuan Yin, CC BY-SA 4.0)
Ad esempio, si fa riferimento a una variabile definita in una richiesta HTTP:
(Chongyuan Yin, CC BY-SA 4.0)
Visualizzando i risultati dell'esecuzione, puoi vedere che il valore della variabile è stato ottenuto:
(Chongyuan Yin, CC BY-SA 4.0)
Configurazione set di dati CSV
Durante un test delle prestazioni, potrebbe essere necessario inserire parametri, come nome utente e password, nell'operazione di accesso. Quando la quantità di concorrenza è relativamente elevata, la generazione di dati in fase di esecuzione comporta un carico pesante per la CPU e la memoria. Il CSV Data Set Config può essere utilizzato come origine dei parametri richiesti in questo scenario.
(Chongyuan Yin, CC BY-SA 4.0)
Le descrizioni di alcuni parametri nella configurazione del set di dati CSV:
- Nome variabile: definisce il nome del parametro nel file CSV, a cui lo script può fare riferimento come
$ {nome variabile}
. - Ricicla su EOF: se impostato su True, consente di ripetere il ciclo dall'inizio quando si raggiunge la fine del file CSV.
- Interrompi thread su EOF: se impostato su True, interrompe l'esecuzione dopo aver letto l'ultimo record nel file CSV.
- Modalità di condivisione: imposta la modalità condivisa tra thread e gruppi di thread.
Affermazioni
L'Asserzione controlla se la richiesta viene restituita come previsto. Le asserzioni sono una parte importante degli script di test automatizzati, quindi dovresti prestarvi molta attenzione.
Le asserzioni comunemente utilizzate da JMeter includono Asserzione di risposta, Asserzione JSON, Asserzione di dimensione, Asserzione di durata, Asserzione di Beanshell, ecc. Di seguito presento l'asserzione JSON utilizzata di frequente.
Asserzione JSON
Viene utilizzato per affermare il contenuto della risposta in formato JSON. In questo esempio viene aggiunta un'asserzione JSON su un campionatore HTTP, come mostrato nell'immagine seguente:
(Chongyuan Yin, CC BY-SA 4.0)
La radice del percorso JSON è sempre chiamata $
, che può essere rappresentata con due stili diversi: notazione punto (.
) o notazione parentesi ([] ). Per esempio;
.$.message[0].name
o $['message'][0]['name']
Ecco un esempio di richiesta effettuata a https://www.google.com/
. Il valore $[0].name
rappresenta la parte 'nome' nel primo elemento dell'array nella risposta.
(Chongyuan Yin, CC BY-SA 4.0)
Il Afferma valore aggiuntivo
specifica che il valore di 'nome'
deve essere verificato e che il valore previsto
dovrebbe essere '2022-world -giorno-dell'apertura-della-coppa'.
Esegui lo script e guarda i risultati. Puoi vedere che l'affermazione è passata.
(Chongyuan Yin, CC BY-SA 4.0)
Ecco le possibili condizioni e come vengono trattate:
- Se il risultato di una risposta non è in formato JSON, viene considerato un errore.
- Se il percorso JSON non riesce a trovare l'elemento, fallisce.
- Se il percorso JSON trova l'elemento, ma non viene impostata alcuna condizione, passa.
- Se il percorso JSON trova un elemento che non soddisfa le condizioni, fallisce.
- Se il percorso JSON trova l'elemento che soddisfa le condizioni, passa.
- Se il percorso JSON restituisce un array, esegue un'iterazione per determinare se qualche elemento soddisfa le condizioni. Se sì, passa. In caso contrario, fallisce.
Torna a Asserzione JSON e seleziona Inverti asserzione.
(Chongyuan Yin, CC BY-SA 4.0)
Esegui lo script, controlla i risultati e puoi vedere che l'asserzione non è riuscita:
(Chongyuan Yin, CC BY-SA 4.0)
Temporizzatori
Il tempo di pausa tra le richieste nel test delle prestazioni è chiamato "tempo di riflessione". Nel mondo reale, il tempo di pausa può essere impiegato nella ricerca o nella lettura di contenuti e il timer simula questa pausa.
Tutti i timer nello stesso ambito vengono eseguiti prima dei campionatori.
Se desideri che il timer venga applicato solo a uno dei campionatori, aggiungi il timer al nodo figlio del campionatore.
I timer JMeter includono principalmente timer costante, timer casuale uniforme, timer di throughput preciso, timer di throughput costante, timer casuale gaussiano, timer JSR223, timer casuale di Poisson, timer di sincronizzazione e timer BeanShell.
Temporizzatore costante
Un timer costante significa che l'intervallo tra ciascuna richiesta è un valore fisso.
(Chongyuan Yin, CC BY-SA 4.0)
Dopo aver configurato il ritardo del thread rispettivamente su 100 e 1000, esegui lo script:
(Chongyuan Yin, CC BY-SA 4.0)
Controlla i dati nella tabella, dove #1 e #2 sono i risultati in esecuzione quando la configurazione è 100 millisecondi e #4 e #5 sono i risultati in esecuzione quando la configurazione è 1000 millisecondi. Puoi vedere che l'intervallo tra #4 e #5 è significativamente maggiore di quello tra #1 e #2:
(Chongyuan Yin, CC BY-SA 4.0)
Temporizzatore di rendimento costante
Il Constant Throughput Timer controlla l'esecuzione delle richieste in base al throughput specificato.
(Chongyuan Yin, CC BY-SA 4.0)
Configura il throughput target su 120 (nota che l'unità è minuti), quindi seleziona Tutti i thread attivi nel gruppo di thread corrente (condiviso) in base al throughput calcolato:
(Chongyuan Yin, CC BY-SA 4.0)
Esegui lo script, controlla i risultati e osserva che la velocità effettiva è di circa 2/secondo (120/60).
(Chongyuan Yin, CC BY-SA 4.0)
Preprocessori e postprocessori
Un preprocessore esegue alcune operazioni prima della richiesta del campionatore. Viene spesso utilizzato per modificare parametri, impostare variabili di ambiente o aggiornare variabili.
Allo stesso modo, un post-processore esegue alcune operazioni dopo la richiesta del campionatore. A volte i dati di risposta devono essere utilizzati nelle richieste successive ed è necessario elaborarli. Ad esempio, se il token jwt
nella risposta viene ottenuto e utilizzato per l'autenticazione nelle richieste successive, viene utilizzato il post-processore.
Utilizzando JMeter
Quanto sopra è l'introduzione ai principali componenti del test di JMeter e ora puoi sentirti sicuro nell'iniziare i tuoi test. In un altro articolo, spiegherò come utilizzare il plugin MQTT in JMeter.