Test di stress Fastapi

Dec 05 2022
Il test della scalabilità di Locust Python è una parte importante per preparare la produzione di servizi Web. Esistono molti strumenti per i test di carico, come Gatling, Apache JMeter, The Grinder, Tsung e altri.

Pitone locusta

I test di scalabilità sono una parte importante per preparare la produzione di servizi Web. Esistono molti strumenti per i test di carico, come Gatling, Apache JMeter, The Grinder, Tsung e altri. Ce n'è anche uno (e il mio preferito) scritto in Python e costruito sulla libreria Requests : Locust .

Come si nota sul sito web di Locust:

Una caratteristica fondamentale di Locust è che descrivi tutto il tuo test nel codice Python. Non sono necessarie interfacce utente ingombranti o XML gonfio, solo codice semplice.

Installazione di locuste

Il modulo Python per il test delle prestazioni Locust è disponibile su PyPI e può essere installato tramite pip o easy_install.

pip install locustio or: easy_install locust

Esempio locustfile.py

Quindi crea locustfile.py seguendo l' esempio da docs. Per testare il progetto Django ho dovuto aggiungere alcune intestazioni per il supporto csrftoken e le richieste ajax. Final locustfile.py potrebbe essere qualcosa di simile al seguente:

# locustfile.py
from locust import HttpLocust, TaskSet, task
class UserBehavior(TaskSet):
def on_start(self):
        self.login()
def login(self):
        # GET login page to get csrftoken from it
        response = self.client.get('/accounts/login/')
        csrftoken = response.cookies['csrftoken']
        # POST to login page with csrftoken
        self.client.post('/accounts/login/',
                         {'username': 'username', 'password': 'P455w0rd'},
                         headers={'X-CSRFToken': csrftoken})
@task(1)
    def index(self):
        self.client.get('/')
@task(2)
    def heavy_url(self):
        self.client.get('/heavy_url/')
@task(2)
    def another_heavy_ajax_url(self):
        # ajax GET
        self.client.get('/another_heavy_ajax_url/',
        headers={'X-Requested-With': 'XMLHttpRequest'})
class WebsiteUser(HttpLocust):
    task_set = UserBehavior

Per eseguire Locust con il file python locust sopra, se è stato chiamato locustfile.py , potremmo eseguire (nella stessa directory di locustfile.py ):

locust --host=http://example.com

Quando viene avviata l'app di test del carico Python Locust, dovresti visitarehttp://127.0.0.1:8089/e lì troverai l'interfaccia web della nostra istanza Locust. Quindi inserire Numero di utenti da simulare (ad es. 300) e Velocità schiusa (utenti generati/secondo) (ad es. 10) e premere Avvia sciame . Dopodiché Locust inizierà a "covare" gli utenti e sarai in grado di vedere i risultati nella tabella.

Visualizzazione dei dati in Python

Quindi, la tabella è carina ma preferiremmo vedere i risultati su un grafico. C'è un problema in cui le persone chiedono di aggiungere un'interfaccia grafica a Locust e ci sono diverse proposte su come visualizzare i grafici per i dati di Locust. Ho deciso di utilizzare la libreria di visualizzazione interattiva Python Bokeh .

È facile installare la libreria grafica Python Bokeh da PyPI usando pip:

pip install bokeh

Ecco un esempio di esecuzione del server Bokeh.

Possiamo ottenere i dati di Locust in formato JSON visitandohttp://localhost:8089/stats/requests. I dati dovrebbero essere qualcosa del genere:

{
       "errors": [],
       "stats": [
           {
               "median_response_time": 350,
               "min_response_time": 311,
               "current_rps": 0.0,
               "name": "/",
               "num_failures": 0,
               "max_response_time": 806,
               "avg_content_length": 17611,
               "avg_response_time": 488.3333333333333,
               "method": "GET",
               "num_requests": 9
           },
           {
               "median_response_time": 350,
               "min_response_time": 311,
               "current_rps": 0.0,
               "name": "Total",
               "num_failures": 0,
               "max_response_time": 806,
               "avg_content_length": 17611,
               "avg_response_time": 488.3333333333333,
               "method": null,
               "num_requests": 9
           }
       ],
       "fail_ratio": 0.0,
       "slave_count": 2,
       "state": "stopped",
       "user_count": 0,
       "total_rps": 0.0
    }

Correre tutti insieme

Quindi il nostro Locust è in esecuzione (in caso contrario, avvialo con locust --host=http://example.com) e ora dovremmo iniziare Bokehservercon bokeh servee quindi eseguire il nostro plotter.py con python plotter.py. Come mostrano le nostre chiamate di script , una scheda del browser viene automaticamente aperta all'URL corretto per visualizzare il documento.

Se Locust sta già eseguendo il test, vedrai immediatamente i risultati sui grafici. Altrimenti inizia un nuovo test ahttp://localhost:8089/e torna alla scheda Bokeh e guarda i risultati dei test in tempo reale.

Questo è tutto. Puoi trovare l'intero codice su github . Sentiti libero di clonarlo ed eseguire l'esempio.

git clone https://github.com/steelkiwi/locust-bokeh-load-test.git
  cd locust-bokeh-load-test
  pip install -r requirements.txt
  locust --host=<place here link to your site>
  bokeh serve
  python plotter.py