Teste de Estresse Fastapi

Dec 05 2022
O teste de escalabilidade do Locust Python é uma parte importante para preparar a produção de serviços da Web. Existem muitas ferramentas para teste de carga, como Gatling, Apache JMeter, The Grinder, Tsung e outras.

Locust Python

O teste de escalabilidade é uma parte importante para preparar a produção de serviços da Web. Existem muitas ferramentas para teste de carga, como Gatling, Apache JMeter, The Grinder, Tsung e outras. Há também um (e meu favorito) escrito em Python e criado na biblioteca Requests : Locust .

Como é notado no site da Locust:

Uma característica fundamental do Locust é que você descreve todos os seus testes em código Python. Não há necessidade de interfaces de usuário desajeitadas ou XML inchado, apenas código simples.

Instalação de gafanhotos

O módulo python de teste de desempenho Locust está disponível no PyPI e pode ser instalado por meio de pip ou easy_install.

pip install locustio or: easy_install locust

Exemplo locustfile.py

Em seguida, crie locustfile.py seguindo o exemplo de docs. Para testar o projeto Django, tive que adicionar alguns cabeçalhos para suporte a csrftoken e solicitações ajax. O locustfile.py final pode ser algo como o seguinte:

# 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 executar o Locust com o arquivo python locust acima, se ele fosse nomeado locustfile.py , poderíamos executar (no mesmo diretório que locustfile.py ):

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

Quando o aplicativo de teste de carga python Locust for iniciado, você deve visitarhttp://127.0.0.1:8089/e lá você encontrará a interface da web de nossa instância do Locust. Em seguida, insira o número de usuários para simular (por exemplo, 300) e a taxa de eclosão (usuários gerados/segundo) (por exemplo, 10) e pressione Iniciar enxame . Depois disso, o Locust começará a "incubar" os usuários e você poderá ver os resultados na tabela.

Visualização de Dados Python

Portanto, a tabela é boa, mas preferimos ver os resultados em um gráfico. Há um problema em que as pessoas pedem para adicionar uma interface gráfica ao Locust e há várias propostas de como exibir gráficos para os dados do Locust. Decidi usar a biblioteca de visualização interativa Python Bokeh .

É fácil instalar a biblioteca de gráficos python Bokeh do PyPI usando pip:

pip install bokeh

Aqui está um exemplo de execução do servidor Bokeh.

Podemos obter dados do Locust no formato JSON visitandohttp://localhost:8089/stats/requests. Os dados devem ser algo como isto:

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

Correndo todos juntos

Portanto, nosso Locust está em execução (se não, inicie-o com ) locust --host=http://example.come agora devemos começar e depois executar nosso plotter.py com . Como mostram nossas chamadas de script , uma guia do navegador é aberta automaticamente para o URL correto para visualizar o documento.Bokehserverbokeh servepython plotter.py

Se o Locust já estiver executando o teste, você verá os resultados nos gráficos imediatamente. Caso contrário, inicie um novo teste emhttp://localhost:8089/e retorne à guia Bokeh e assista aos resultados dos testes em tempo real.

É isso. Você pode encontrar o código completo no github . Sinta-se à vontade para cloná-lo e executar o exemplo.

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