Locust Load Test

Image: Infra as Code

Locust Load Test

Salve jovens!! No ciclo de entrega de software, o teste de carga uma das etapas mais importantes. É como ele, e somente com ele seremos capazes de afirmar que o sistema suporta uma carga X ou Y.

Recentemente eu testei uma ferramenta simples de instalar e de utilizar chamada de Locust.io. Neste post, vou explicar um pouco do Locust, ela é super fácil de instalar e de usar, e como pode te ajudar a simular muitos usuários acessando sua aplicação simultaneamente, revelando gargalos e garantindo que seus sistemas estejam sempre rodando liso.

AHH! Podem aguardar a parte II deste assunto, pois precisei colocar os labs para um segundo post ;).

O que é Teste de carga e por que ele é tão importante?

Vamos fazer uma breve recapitulação sobre o que é teste de carga e por que ele é tão vital para qualquer ambiente na cloud. Pensa comigo, você tem uma aplicação que funciona perfeitamente no seu laptop quando você e mais alguns colegas estão usando, blz?. Mas e se de repente 1.000, 10.000 ou até 100.000 usuários tentam acessá-la ao mesmo tempo? Ela aguenta o tranco? Ela segue funcionando bem?

É nessa hora que você precisa lembrar do teste carga entra. Basicamente, é o processo de simular um grande número de usuários (ou “carga”) interagindo com seu sistema para ver como ele se comporta. O objetivo é identificar pontos fracos, gargalos, falhas de desempenho e limites de capacidade antes que eles virem um problemão na vida real.

Por que é importante?

  • Garantia de estabilidade, evitar quedas inesperadas e lentidão.
  • Melhora da experiência do usuário, ninguém gosta de uma aplicação lenta, né?
  • Otimização der recursos, entender a capacidade real ajuda a dimensionar sua infraestrutura de forma eficiente, evitando gastos desnecessários.
  • Identificação de gargalos, descobrir onde a coisa “aperta” pode ser o banco de dados, a rede, o servidor de aplicação, etc.

Se quiserem mais detalhes, existem três posts antigos explicando em detalhes o que é um teste de carga, veja os links:

Instalando e usando o Locust

Agora que você já sabe da importância do teste de carga, vamos falar do Locust. O Locust é uma ferramenta de teste em Python. O que o torna simples de usar é a sua abordagem em vez de usar uma interface gráfica complexa para criar cenários de teste, você escreve o comportamento dos seus usuários em código Python puro. Isso significa uma flexibilidade e uma curva de aprendizado mais baixa para quem já tem familiaridade com programação.

Instalação

É muito simples instalar, é simples mesmo!!!!

1$ sudo apt install python3-pip -y
2$ sudo apt-get install python3-locust -y 
3$ locust --version
4locust  from /usr/lib/python3/dist-packages/locust (python 3.12.3)

Usando Locust

Como eu só queria testar e ver o funcionamento básico, eu apontei para um serviço público e disparei poucos resquests para o destino.

from locust import HttpUser, task, between

class MeuPrimeiroUsuario(HttpUser):
    host = "http://google.com" 
    wait_time = between(1, 5)

    @task
    def acessar_pagina_inicial(self):
        self.client.get("/")

Veja o dashboard de resultados, gostei bastante da interface web da ferramenta.

Image: Locust Dashboard

Usando o em modo texto

Para mim, é um ponto de avaliação a ferramenta ter uma boa saída no terminal. Por que é importante meu jovem? Lembre-se, idealmente todas as ferramentas do seu “cinto de utilidades” devem ser executadas pelo pipeline, sendo assim deve ser fácil iniciar e captar a saída do comando para que seja possível realizar algum tipo de integração com o pipeline de CI/CD.

locust -f  ./test001.py --headless -u 20 -r 5 -t 10s

Vejam o resultado

Type     Name                                                                          # reqs      # fails |    Avg     Min     Max    Med |   req/s  failures/s
--------|----------------------------------------------------------------------------|-------|-------------|-------|-------|-------|-------|--------|-----------
--------|----------------------------------------------------------------------------|-------|-------------|-------|-------|-------|-------|--------|-----------
         Aggregated                                                                         0     0(0.00%) |      0       0       0      0 |    0.00        0.00

[2025-06-01 10:53:32,595] /INFO/locust.runners: Ramping to 20 users at a rate of 5.00 per second
Type     Name                                                                          # reqs      # fails |    Avg     Min     Max    Med |   req/s  failures/s
--------|----------------------------------------------------------------------------|-------|-------------|-------|-------|-------|-------|--------|-----------
GET      /                                                                                 14     0(0.00%) |    237     176     477    230 |    0.00        0.00
--------|----------------------------------------------------------------------------|-------|-------------|-------|-------|-------|-------|--------|-----------
         Aggregated                                                                        14     0(0.00%) |    237     176     477    230 |    0.00        0.00

[2025-06-01 10:53:35,598] /INFO/locust.runners: All users spawned: {"MeuPrimeiroUsuario": 20} (20 total users)
Type     Name                                                                          # reqs      # fails |    Avg     Min     Max    Med |   req/s  failures/s
--------|----------------------------------------------------------------------------|-------|-------------|-------|-------|-------|-------|--------|-----------
GET      /                                                                                 39     0(0.00%) |    222     166     477    220 |    4.50        0.00
--------|----------------------------------------------------------------------------|-------|-------------|-------|-------|-------|-------|--------|-----------
         Aggregated                                                                        39     0(0.00%) |    222     166     477    220 |    4.50        0.00

Type     Name                                                                          # reqs      # fails |    Avg     Min     Max    Med |   req/s  failures/s
--------|----------------------------------------------------------------------------|-------|-------------|-------|-------|-------|-------|--------|-----------
GET      /                                                                                 61     0(0.00%) |    210     166     477    200 |    8.00        0.00
--------|----------------------------------------------------------------------------|-------|-------------|-------|-------|-------|-------|--------|-----------
         Aggregated                                                                        61     0(0.00%) |    210     166     477    200 |    8.00        0.00

Type     Name                                                                          # reqs      # fails |    Avg     Min     Max    Med |   req/s  failures/s
--------|----------------------------------------------------------------------------|-------|-------------|-------|-------|-------|-------|--------|-----------
GET      /                                                                                 83     0(0.00%) |    204     166     477    190 |    9.00        0.00
--------|----------------------------------------------------------------------------|-------|-------------|-------|-------|-------|-------|--------|-----------
         Aggregated                                                                        83     0(0.00%) |    204     166     477    190 |    9.00        0.00

[2025-06-01 10:53:42,357] /INFO/locust.main: --run-time limit reached, shutting down
[2025-06-01 10:53:42,395] /INFO/locust.main: Shutting down (exit code 0)
Type     Name                                                                          # reqs      # fails |    Avg     Min     Max    Med |   req/s  failures/s
--------|----------------------------------------------------------------------------|-------|-------------|-------|-------|-------|-------|--------|-----------
GET      /                                                                                103     0(0.00%) |    202     166     477    190 |   10.72        0.00
--------|----------------------------------------------------------------------------|-------|-------------|-------|-------|-------|-------|--------|-----------
         Aggregated                                                                       103     0(0.00%) |    202     166     477    190 |   10.72        0.00

Response time percentiles (approximated)
Type     Name                                                                                  50%    66%    75%    80%    90%    95%    98%    99%  99.9% 99.99%   100% # reqs
--------|--------------------------------------------------------------------------------|--------|------|------|------|------|------|------|------|------|------|------|------
GET      /                                                                                     190    200    200    220    240    250    250    290    480    480    480    103
--------|--------------------------------------------------------------------------------|--------|------|------|------|------|------|------|------|------|------|------|------
         Aggregated                                                                            190    200    200    220    240    250    250    290    480    480    480    103

Usando em modo texto e pensando em integrações

A melhor forma que eu encontrei de gerar um resultado com uma resposta possível de integrar com outras ferramentas foi utilizando a opção –csv. Gerando uma saída em formato CSV que posteriormente pode ser tratada e guardada automaticamente em formato de tabela em um wiki do projeto.

locust -f  ./test001.py --headless -u 20 -r 5 -t 10s  --csv relatorio_teste
$ cat relatorio_teste_stats.csv 
Type,Name,Request Count,Failure Count,Median Response Time,Average Response Time,Min Response Time,Max Response Time,Average Content Size,Requests/s,Failures/s,50%,66%,75%,80%,90%,95%,98%,99%,99.9%,99.99%,100%
GET,/,82,0,330.0,467.3654307900905,175.07406091317534,1838.0322779994458,17942.10975609756,9.237214940424057,0.0,480,530,560,610,750,1200,1800,1800,1800,1800,1800
,Aggregated,82,0,330.0,467.3654307900905,175.07406091317534,1838.0322779994458,17942.10975609756,9.237214940424057,0.0,480,530,560,610,750,1200,1800,1800,1800,1800,1800

Testes distribuídos

Uma das coisas de que gostei e considero essencial em uma ferramenta de teste de carga é a capacidade de executar testes distribuídos. Nem sempre uma única origem consegue gerar a quantidade necessária de requisições, threads ou usuários para os testes desejados. Por isso, é importante que a ferramenta permita a execução de testes a partir de múltiplas localidades, algo que o Locust torna bem fácil de fazer.

Para rodar em modo distribuído, você inicia o master com:

No servidor master, execute o seguinte comando:

locust -f meu_teste.py --master

Nos servidores de work

locust -f meu_teste.py --worker --master-host=IP_DO_MASTER

Resumo

Gostei muito da ferramenta Locust ela atende bem a um público técnico de redes, sistemas e cloud. Oferece vantagens como o controle total sobre o que será executado, o que facilita bastante para quem já está familiarizado com scripts e automação em Python. A instalação e execução são bem simples, o que significa menos tempo configurando e mais tempo testando e isso, para mim, é uma grande vantagem.

A interface web do Locust é extremamente útil para monitorar os testes em tempo real, exibindo métricas como requisições por segundo, tempos de resposta e falhas. Esses dados ajudam a identificar problemas rapidamente exatamente o que um engenheiro DevOps precisa.

Sem a menor dúvida, essa ferramenta agora tem lugar garantido na minha caixa de ferramentas. Ganhou meu 👍!

Abraços!

Vida longa e próspera a todos!!

Referências


Entre em contato:

NewsLetter - https://engineeringmanager.com.br/
Linkdin - linkedin.com/in/leonardoml/
Twitter: @infraascode_br

Te convido a ver os outros posts do blog Infra-as-Code garanto que tem coisas legais lá!!


--- --- IMPORTANTE --- ---
As opiniões aqui expressas são pessoais e de responsabilidade única e exclusiva do autor, elas não refletem necessariamente a posição das empresas que eu trabalho(ei) e/ou presto(ei) serviço.


bio_banner_test