Pruebas de estrés Fastapi

Dec 05 2022
Las pruebas de escalabilidad de Locust Python son una parte importante para preparar la producción de servicios web. Hay muchas herramientas para pruebas de carga, como Gatling, Apache JMeter, The Grinder, Tsung y otras.

pitón langosta

Las pruebas de escalabilidad son una parte importante para preparar la producción de servicios web. Hay muchas herramientas para pruebas de carga, como Gatling, Apache JMeter, The Grinder, Tsung y otras. También hay uno (y mi favorito) escrito en Python y creado en la biblioteca Requests : Locust .

Como se nota en el sitio web de Locust:

Una característica fundamental de Locust es que describe todas sus pruebas en código Python. No hay necesidad de interfaces de usuario torpes o XML inflados, solo código simple.

Instalación de langosta

El módulo de prueba de rendimiento de Python Locust está disponible en PyPI y se puede instalar a través de pip o easy_install.

pip install locustio or: easy_install locust

Ejemplo locustfile.py

Luego cree locustfile.py siguiendo el ejemplo de docs. Para probar el proyecto Django, tuve que agregar algunos encabezados para el soporte csrftoken y las solicitudes ajax. Locustfile.py final podría ser algo como lo siguiente:

# 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

Para ejecutar Locust con el archivo locust de python anterior, si se llamara locustfile.py , podríamos ejecutarlo (en el mismo directorio que locustfile.py ):

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

Cuando se inicie Locust, la aplicación de prueba de carga de Python, debe visitarhttp://127.0.0.1:8089/y allí encontrará la interfaz web de nuestra instancia de Locust. Luego ingrese el número de usuarios para simular (p. ej., 300) y la tasa de eclosión (usuarios generados/segundo) (p. ej., 10) y presione Iniciar enjambre . Después de eso, Locust comenzará a "eclosionar" a los usuarios y podrá ver los resultados en la tabla.

Visualización de datos de Python

Por lo tanto, la tabla está bien, pero preferimos ver los resultados en un gráfico. Hay un problema en el que las personas solicitan agregar una interfaz gráfica a Locust y hay varias propuestas sobre cómo mostrar gráficos para los datos de Locust. Decidí usar la biblioteca de visualización interactiva de Python Bokeh .

Es fácil instalar la biblioteca de gráficos de Python Bokeh desde PyPI usando pip:

pip install bokeh

Aquí hay un ejemplo de cómo ejecutar el servidor Bokeh.

Podemos obtener datos de Locust en formato JSON visitandohttp://localhost:8089/stats/requests. Datos allí debería ser algo como esto:

{
       "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
    }

Corriendo todos juntos

Entonces, nuestro Locust se está ejecutando (si no, comience con locust --host=http://example.com) y ahora deberíamos comenzar Bokehservercon bokeh servey luego ejecutar nuestro plotter.py con python plotter.py. Como muestra nuestra secuencia de comandos , se abre automáticamente una pestaña del navegador en la URL correcta para ver el documento.

Si Locust ya está ejecutando la prueba, verá los resultados en gráficos de inmediato. De lo contrario, comience una nueva prueba enhttp://localhost:8089/y regrese a la pestaña Bokeh y vea los resultados de las pruebas en tiempo real.

Eso es todo. Puede encontrar el código completo en github . Siéntase libre de clonarlo y ejecutar el ejemplo.

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