Test di carico API con Locust

Test di carico API con Locust

Test di carico API con Locust: introduzione

Probabilmente ti sei già trovato in questa situazione: scrivi codice che fa qualcosa, ad esempio un endpoint. Testi il ​​tuo endpoint utilizzando Postman o Insomnia e tutto funziona correttamente. Passi l'endpoint allo sviluppatore lato client, che quindi utilizza il file API e distribuisce l'applicazione. Ma poi, l'API fallisce quando gli utenti utilizzano l'app.

Questa può essere una situazione super fastidiosa in cui trovarsi, per non dire costosa per un'azienda. È per questo che gli sviluppatori di software eseguono una serie di test sui sistemi software per assicurarsi che funzionino come previsto. Le API non sono diverse. Prima della distribuzione, dovresti eseguire almeno test delle prestazioni e test di sicurezza.

I test delle prestazioni possono essere raggruppati in test di funzionalità e test di carico. I test di funzionalità sono ciò per cui di solito usi Postman o Insomnia. Garantiscono che la tua API funzioni come previsto. I test di carico, d'altra parte, riguardano maggiormente le prestazioni dell'API con l'utilizzo nel mondo reale e il carico di picco, ed è di questo che tratta questo articolo. Diamo un'occhiata ai test di carico in modo più dettagliato.

Che cos'è il test di carico API?

Il test del carico API è un tipo di test utilizzato dagli sviluppatori per simulare il carico normale e di picco sugli endpoint. Questo tipo di test consente agli sviluppatori di valutare le prestazioni reali di un'API prima che venga distribuita. Li aiuta a identificare la massima capacità operativa di un sistema, gli eventuali colli di bottiglia e il degrado delle prestazioni. I test di carico dell'API vengono in genere eseguiti creando utenti virtuali e quindi utilizzandoli per testare contemporaneamente la funzionalità dell'API. 

I test di carico delle API misurano metriche come tempo di risposta, utenti simultanei, velocità di throughput, livelli di utilizzo delle risorse, tempo medio tra i guasti (MTBF), tempo medio tra i guasti (MTTF) e così via. Tutte queste metriche possono essere utilizzate per determinare il rendimento dell'API.

Tipi di test di carico

Esistono diversi tipi di test di carico, ognuno con i suoi casi d'uso. Diamo un'occhiata ad alcuni di loro.

Prova di carico: Questa è la forma base di un test di carico. Viene utilizzato per valutare le prestazioni di un sistema (in questo caso, un'API) in condizioni di carico normale e carico di picco previsto.

Prova di sforzo: Viene utilizzato per valutare le prestazioni di un sistema sotto un carico molto pesante. L'obiettivo di questo test è vedere se un sistema si ripristina dopo un guasto e quanto tempo ci vuole per farlo. Il carico viene solitamente aumentato lentamente fino a superare le capacità del sistema.

Test dei picchi: Questo è un po 'simile allo stress test, tranne per il fatto che il carico pesante viene applicato all'improvviso, invece di aumentarlo lentamente. Questo tipo di test rappresenta ciò che accade quando si verifica un picco improvviso nel numero medio di utenti o visitatori o quando si verifica un attacco DDOS al sistema.

Test di immersione: Questo test è diverso dagli altri precedenti. Mette il tuo sistema sotto l'80% (o giù di lì) del carico normale e lo lascia in funzione per un lungo periodo, diciamo da 12 a 14 ore. Questo tipo di test determina l'affidabilità di un sistema nel tempo.

Carica test delle tue API con Locust

Gli sviluppatori hanno accesso a una varietà di opzioni per testare il carico delle loro API. Alcuni strumenti di test di carico comuni sono Gatling, JMeter e Locust. Ci concentreremo su Locust in questo articolo.

Locust è uno strumento di test di carico open source basato su Python utilizzato da aziende leader come Google, Microsoft e Riot Games per testare le proprie API. In questo articolo, dimostreremo come eseguire il test di carico di un'API. 

Per questo tutorial, creerò una semplice API con Flask. Puoi seguirmi o semplicemente creare la tua API con Node o qualsiasi framework ti trovi a tuo agio.

Requisiti

Python 3

Configurazione e installazione

Innanzitutto, devi configurare un ambiente virtuale sul tuo PC in modo da non rovinare il tuo ambiente Python globale. Per fare ciò, esegui i seguenti comandi. Si noti che questi comandi si applicano a un terminale Windows.

progetto $ mkdir

$ cd /d percorso\al\progetto

$ python -m venv venv

$venv\Scripts\activate

 

Innanzitutto, abbiamo creato un progetto directory. Quindi abbiamo cambiato la nostra directory corrente in progetto. Abbiamo quindi creato e attivato un ambiente virtuale per Python all'interno di quella directory. 

Passiamo ora all'installazione pallone(lo useremo per creare gli endpoint da sottoporre a test di carico) e Locusta stessa. 

 

Per installare Flask, esegui. Assicurati di essere nel progetto dove hai creato un ambiente virtuale.

$ pip installa pallone

 

Per installare Locust, esegui

$ pip installa locusta

 

Fatto ciò, digita i seguenti comandi. Assicurati di essere nel tuo progetto directory quando lo fai.

$ copia nulla __init__.py

$mkdir app

$ copia nul app\app.py

$ copia nul app\__init__.py

 

Questo comando crea alcuni file che useremo per creare i nostri endpoint usando Flask. A proposito, puoi anche creare questi file usando il tuo file explorer. Ma qual è il divertimento in questo? Dopo averlo fatto, copia il codice seguente in app.py

dall'importazione di flask Flask, jsonify, request

app = Flask (__ name__)

modelli_auto = [

  { 'marca': 'Tesla', 'modello': 'Modello S' }

]

 

modelli_aereo = [

  { 'marca': 'Boeing', 'modello': '747' }

]

 

@app.route('/cars')

def get_cars():

  restituire jsonify(modelli_auto)

@app.route('/planes')

def get_planes():

  restituisce jsonify(plane_models)

if __name__ == '__main__':

    app.run(debug=Vero)  

 

Il codice precedente contiene un metodo get_cars usato per ottenere un elenco di marche di automobili e dei loro modelli, e get_planes usato per ottenere un elenco di marche di aerei e dei loro modelli. Per poter caricare il test di questo endpoint, dobbiamo eseguire app.py. Per farlo, esegui il comando seguente.

$ percorso python\to\app.py

Una volta eseguito, dovresti vedere qualcosa del genere:

Test di carico dell'API 1

Se copi l'URL dal terminale e digiti auto or piani dopo la /, dovresti essere in grado di vedere i dati lì. Tuttavia, il nostro obiettivo è testare l'endpoint con locust, non con il browser. Quindi facciamolo. Esegui il seguente comando nella radice del tuo file progetto directory.

 

$ copia nulla locust_test.py

 

Questo crea un file 'locust_test.py' nella root del tuo progetto directory. Dopo averlo fatto, apri il file e incolla il codice seguente. Lo spiegheremo a breve.

 

tempo di importazione

da locust import HttpUser, task, between

 

classe UserBehaviour(HttpUser):

    wait_time = tra(5, 10)

 

    @compito

    def get_auto(self):

        self.client.get('/cars')

    

    @compito

    def get_piani(self):

        self.client.get('/piani')

 

Questo è un esempio di base dell'utilizzo di Locust per testare un'API. Innanzitutto, creiamo una classe Comportamento utente, a cui può essere assegnato qualsiasi nome appropriato ma deve essere esteso HttpUtente. HttpUtente è la classe che si occupa di istanziare più utenti virtuali per svolgere i compiti che specifichiamo nel Comportamento utente classe. 

Un'attività viene specificata decorando un metodo con l'estensione @compito decoratore. Abbiamo anche una funzione chiamata fra() che ci consente di specificare un intervallo di secondi da attendere prima di eseguire l'attività successiva. Puoi vedere che nel nostro codice abbiamo assegnato un intervallo da 5 a 10 secondi. 

Per eseguire il codice, assicurati di essere ancora nel tuo ambiente virtuale. Se quello che hai creato è utilizzato dal server che serve l'API, apri un nuovo terminale, cambia la tua directory in your progetto directory e attivare l'ambiente virtuale creato. Puoi trovare il comando per l'attivazione di un ambiente virtuale sopra. Ora, inserisci il comando seguente nel tuo terminale.

 

$ locusta -f locusta_test.py

 

Dovresti vedere qualcosa di simile a questo:

Test di carico dell'API 2

Per impostazione predefinita, l'interfaccia web di locust si trova su http://localhost/8089. Se visiti il ​​sito web, dovresti vedere un'interfaccia come questa:

Test di carico dell'API 3

Dall'interfaccia, possiamo specificare il numero di utenti, il tasso di spawn (utenti creati al secondo) e l'Host. Puoi ottenere l'indirizzo del tuo host controllando il terminale in cui è in esecuzione il server. Nel nostro caso, è alla porta 5000. Quando fai clic su Inizia a sciamare, ti verrà presentata l'interfaccia qui sotto.

Test di carico dell'API 4

Questo mostra varie metriche utili come il numero di richieste non riuscite, il tempo medio per una richiesta, il tempo minimo per una richiesta, le richieste al secondo e così via. Una volta che sei soddisfatto di ciò che vedi, puoi fare clic sul pulsante di arresto. 


Oltre alla Statistiche scheda, c'è un Grafici scheda che mostra di più informazioni sotto forma di un grafico, come l'immagine qui sotto.

C'è un grafico delle richieste totali al secondo, grafico del tempo di risposta, ed grafico del numero di utenti, tutto tramato contro il tempo. Utilizzando i grafici, puoi determinare quanti utenti sono accettabili per un tempo di risposta fisso, oppure puoi osservare i tuoi grafici per un tempo di risposta costante nonostante un numero crescente di utenti e altri approfondimenti del genere. Se vuoi condividere questi stats con qualcun altro, puoi scaricare un rapporto dal file Scarica i dati scheda.

Concludere...

Il test di carico della tua API è un'attività cruciale nel tuo processo di sviluppo, quindi assicurati che sia incorporato nel tuo ciclo di progettazione. A proposito, puoi anche eseguire altri tipi di test di carico variando i valori per il numero di utenti e il tasso di spawn. 

Se vuoi eseguire uno spike test, specifica un valore elevato (ad esempio 2000) per il numero di utenti, quindi un valore altrettanto elevato per il tasso di spawn (ad esempio 500). Ciò significa che in 4 secondi avresti creato tutti i 2000 utenti e accedi ai tuoi endpoint. Uno stress test sarà simile, ma con un valore molto più basso per il tasso di spawn. Per scoprire tutto quello che puoi fare, dai un'occhiata a Locust documentazione