Teste de carga de API com Locust

Teste de carga de API com Locust

Teste de carga de API com Locust: introdução

Você provavelmente já esteve nessa situação antes: você escreve um código que faz algo, um endpoint, por exemplo. Você testa seu endpoint usando Postman ou Insomnia e tudo funciona bem. Você passa o endpoint para o desenvolvedor do lado do cliente, que então consome o API e implanta o aplicativo. Mas então, a API falha quando os usuários usam o aplicativo.

Esta pode ser uma situação super irritante para se estar, para não mencionar caro para um negócio. É por isso que os desenvolvedores de software realizam uma variedade de testes em sistemas de software para garantir que funcionem conforme o esperado. As APIs não são diferentes. Antes da implantação, você deve fazer pelo menos testes de desempenho e testes de segurança.

Os testes de desempenho podem ser agrupados em testes de funcionalidade e testes de carga. Os testes de funcionalidade são para os quais você costuma usar Postman ou Insomnia. Eles garantem que sua API funcione conforme o esperado. Os testes de carga, por outro lado, estão mais preocupados com o desempenho da sua API com o uso do mundo real e carga de pico, e é sobre isso que trata este artigo. Vejamos os testes de carga com mais detalhes.

O que é teste de carga de API?

O teste de carga da API é um tipo de teste que os desenvolvedores usam para simular carga normal e de pico nos endpoints. Esse tipo de teste permite que os desenvolvedores avaliem o desempenho real de uma API antes de sua implantação. Isso os ajuda a identificar a capacidade operacional máxima de um sistema, gargalos, se houver, e degradação do desempenho. Os testes de carga da API geralmente são feitos criando usuários virtuais e, em seguida, usando-os para testar a funcionalidade da API simultaneamente. 

Os testes de carga de API medem métricas como tempo de resposta, usuários simultâneos, taxas de throughput, níveis de utilização de recursos, tempo médio entre falhas (MTBF), tempo médio para falhas (MTTF) e assim por diante. Todas essas métricas podem ser usadas para determinar o desempenho da API.

Tipos de teste de carga

Existem vários tipos de teste de carga, cada um com seus casos de uso. Vamos dar uma olhada em alguns deles.

Teste de Carga: Esta é a forma básica de um teste de carga. É usado para avaliar o desempenho de um sistema (neste caso, uma API) sob carga normal e pico de carga esperado.

Teste de Estresse: Isso é usado para avaliar o desempenho de um sistema sob uma carga muito pesada. O objetivo desse teste é verificar se um sistema se recupera após uma falha e quanto tempo leva para isso. A carga geralmente aumenta lentamente até exceder as capacidades do sistema.

Teste de pico: Isso é um pouco semelhante ao teste de estresse, exceto que uma carga pesada é aplicada repentinamente, em vez de aumentá-la lentamente. Esse tipo de teste representa o que acontece quando há um aumento repentino no número médio de usuários ou visitantes ou quando há um ataque DDOS em seu sistema.

Teste de imersão: Este teste é diferente dos outros acima. Ele coloca seu sistema abaixo de 80% (ou aproximadamente) da carga normal e o deixa funcionando por um longo período, digamos 12 a 14 horas. Esse tipo de teste determina a confiabilidade de um sistema ao longo do tempo.

Teste de carga de suas APIs com Locust

Os desenvolvedores têm acesso a uma variedade de opções para testar a carga de suas APIs. Algumas ferramentas comuns de teste de carga são Gatling, JMeter e Locust. Vamos nos concentrar no Locust neste artigo.

O Locust é uma ferramenta de teste de carga de código aberto baseada em python usada pelas principais empresas, como Google, Microsoft e Riot Games, para testar suas APIs. Neste artigo, demonstraremos como carregar o teste de uma API. 

Para este tutorial, criarei uma API simples com Flask. Você pode acompanhar comigo ou apenas criar sua API com Node, ou qualquer framework com o qual você se sinta confortável.

Requisitos

Python 3

Configuração e instalação

Primeiro, você precisa configurar um ambiente virtual em seu PC para não bagunçar seu ambiente Python global. Para fazer isso, execute os seguintes comandos. Observe que esses comandos se aplicam a um terminal do Windows.

$ mkdir projeto

$ cd /d caminho\para\projeto

$ python -m venv venv

$ venv\Scripts\ativar

 

Primeiro, criamos um projeto diretório. Em seguida, mudamos nosso diretório atual para projeto. Em seguida, criamos e ativamos um ambiente virtual para Python dentro desse diretório. 

Agora, vamos passar para a instalação Frasco(vamos usá-lo para criar os endpoints a serem testados em carga) e Gafanhoto si. 

 

Para instalar o Flask, execute. Certifique-se de que você está no projeto onde você criou um ambiente virtual.

$ pip instalar frasco

 

Para instalar o Locust, execute

$ pip instalar locust

 

Feito isso, digite os seguintes comandos. Certifique-se de que você está em seu projeto diretório quando você faz isso.

$ copiar nul __init__.py

aplicativo $ mkdir

$ copiar nul app\app.py

$ copiar nul app\__init__.py

 

Este comando cria alguns arquivos que usaremos para criar nossos endpoints usando o Flask. A propósito, você também pode criar esses arquivos usando seu explorador de arquivos. Mas qual é a graça nisso? Depois de fazer isso, copie o código abaixo em aplicativo.py

do frasco importar Flask, jsonify, solicitar

app = Flask (__ name__)

modelos_carros = [

  { 'marca': 'Tesla', 'modelo': 'Modelo S' }

]

 

modelos_plano = [

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

]

 

@app.route('/carros')

def get_cars():

  retornar jsonify(modelos_carro)

@app.route('/aviões')

def get_planes():

  retornar jsonify(plane_models)

if __name__ == '__main__':

    app.run (debug = True)  

 

O código acima contém um método get_cars usado para obter uma lista de marcas de carros e seus modelos, e get_planes usado para obter uma lista de marcas de aviões e seus modelos. Para carregarmos o teste desse endpoint, precisamos executar app.py. Para fazer isso, execute o comando abaixo.

$ caminho python para app.py

Depois de executá-lo, você deve ver algo assim:

Teste de carga de API 1

Se você copiar a URL do terminal e digitar carros or aviões após o /, você poderá ver os dados lá. No entanto, nosso objetivo é testar o endpoint com o locust, não com o navegador. Então vamos fazer isso. Execute o seguinte comando na raiz do seu projeto diretório.

 

$ copiar nul locust_test.py

 

Isso cria um arquivo 'locust_test.py' na raiz do seu projeto diretório. Depois de fazer isso, abra o arquivo e cole o código abaixo. Vamos explicar em breve.

 

tempo de importação

do locust import HttpUser, tarefa, entre

 

classe UserBehaviour(HttpUser):

    wait_time = entre (5, 10)

 

    @tarefa

    def get_cars(self):

        self.client.get('/carros')

    

    @tarefa

    def get_planes(self):

        self.client.get('/planos')

 

Este é um exemplo básico de uso do Locust para testar a carga de uma API. Primeiro, criamos uma classe Comportamento do usuário, que pode receber qualquer nome apropriado, mas deve se estender HttpUser. HttpUser é a classe que se encarrega de instanciar vários usuários virtuais para realizar as tarefas que especificamos no Comportamento do usuário classe. 

Uma tarefa é especificada decorando um método com o @tarefa decorador. Também temos uma função chamada entre() que nos permite especificar um intervalo de segundos para aguardar antes de executar a próxima tarefa. Você pode ver que atribuímos um intervalo de 5 a 10 segundos para isso em nosso código. 

Para executar o código, verifique se você ainda está em seu ambiente virtual. Se aquele que você criou estiver sendo usado pelo servidor que atende a API, abra um novo terminal, altere seu diretório para o seu projeto diretório e ative o ambiente virtual que você criou. Você pode encontrar o comando para ativar um ambiente virtual acima. Agora, digite o comando abaixo no seu terminal.

 

$ gafanhoto -f locust_test.py

 

Você deveria ver algo assim:

Teste de carga de API 2

Por padrão, a interface da Web do locust está localizada em http://localhost/8089. Se você visitar o site, deverá ver uma interface como esta:

Teste de carga de API 3

Na interface, podemos especificar o número de usuários, a taxa de geração (usuários criados por segundo) e o host. Você pode obter o endereço do seu host verificando o terminal em que o servidor está sendo executado. No nosso caso, está na porta 5000. Ao clicar em Comece a enxamear, você será presenteado com a interface abaixo.

Teste de carga de API 4

Isso mostra várias métricas úteis, como número de solicitações com falha, tempo médio para uma solicitação, tempo mínimo para uma solicitação, solicitações por segundo e assim por diante. Quando estiver satisfeito com o que vê, você pode clicar no botão Parar. 


Além do Estatísticas guia, há um charts guia que mostra mais INFORMAÇÕES na forma de um gráfico, como na imagem abaixo.

Há um total de solicitações por segundo gráfico, gráfico de tempo de resposta, e gráfico de número de usuários, tudo plotado contra o tempo. Usando os gráficos, você pode determinar quantos usuários são aceitáveis ​​para um tempo de resposta fixo ou pode observar seus gráficos para um tempo de resposta constante, apesar de um número crescente de usuários e outros insights como esse. Se você quiser compartilhar estes stats com outra pessoa, você pode baixar um relatório do Baixar dados aba.

Concluir...

O teste de carga de sua API é uma atividade crucial em seu processo de desenvolvimento, portanto, certifique-se de que ela seja incorporada ao seu ciclo de design. A propósito, você também pode realizar outros tipos de teste de carga variando os valores para o número de usuários e a taxa de geração. 

Se você quiser fazer um teste de pico, especifique um valor grande (digamos 2000) para o número de usuários e, em seguida, um valor igualmente grande para sua taxa de geração (500, por exemplo). Isso significa que em 4 segundos, você teria todos os 2000 usuários criados e acessando seus endpoints. Um teste de estresse será semelhante, mas com um valor muito menor para a taxa de desova. Para descobrir tudo o que você pode fazer, confira o Locust documentação