locust-logo

Efetuando teste de carga com o Locust

Os testes de carga consistem em colocar uma demanda em um sistema de software ou dispositivo e medir a sua resposta. Este tipo de teste é realizado para determinar o comportamento de um sistema sob condições normais e picos de carga. Ela ajuda a identificar a capacidade máxima de operação de uma aplicação, bem como os gargalos e determinar qual elemento está causando lentidão.

Uma das ferramentas mais conceituadas nesse tipo de testes é o Apache JMeter™, porém hoje iremos abordar o Locust, uma ferramenta escrita em Python extremamente simples e poderosa.

O Locust é focado em teste de aplicações Web, possuindo possibilidade de distribuição entre várias máquinas, criando um cluster para teste, podendo simular milhões de usuário conectados simultaneamente. A configuração é toda feita em Python, sem a necessidade de arquivos XML’s gigantes como alguns de seus concorrentes.

Instalação

O Locust é apenas compatível com Python 2.6 e 2.7. Para instalar basta executar o comando:

pip install locustio

Exemplo de configuração

Vamos criar um arquivo chamado locustfile.py e adicionar o código:

O método on_start é responsável por autenticar o nosso client HTTP, caso sua aplicação necessite autenticação. index, about e catch_response são os endpoints que irão ser testados. Note que eles são decorados com @task, isto indica que ao disparar os testes de carga, esses dois endpoints serão testados com o mesmo peso de usuários. Por exemplo, se definirmos que serão 1000 usuários simultâneos ambos receberão esta carga. Um meio de mudar isto é passar um número para o decorator, como por exemplo @task(2), isto indica que o endpoint tem peso maior, neste caso o dobro de usuários.

Se você já é acostumado com Python e conhece a biblioteca requests, o self.client é uma sessão do requests.

No teste catch_response observamos como tratar um resultado, no nosso caso, necessitamos tratar pois a página deverá retornar 404, caso não for tratado o Locust irá entender que a página contém um erro, pois todos os resultados devem retornar código de sucesso. Quando utilizamos a opção catch_response=True o Locust irá assumir a nossa validação como validado.

Executando o Locust

O Locust pode ser executado através de uma interface Web, ou se você preferir através do terminal por completo.

Para iniciar os testes com interface web execute o comando:

locust -f locustfile.py -H http://meusite.com

Após isto acesse http://127.0.0.1:8089. Você deverá ver uma tela similar a esta:

locust-screenshot

Nela basta definir a quantidade de usuários simultâneos e o hatch rate (frequência de chegada de usuários), e esperar os resultados.

Para executar todos os testes através da linha do terminal execute o comando:

locust -f locustfile.py -H http://meusite.com -c 100000 -r 1000 -n 10000 --no-web

Para entender um pouco melhor, -c é o número de clientes conectados, -r é o hatch rate e -n é o número de requests a serem executados.

Consideração final

Lembre-se, se você executar os testes apenas de uma máquina você não irá conseguir simular muitos usuários simultâneos. Isso porque o seu computador pode não aguentar a carga que você deseja simular.

Outro ponto importante é executar o teste de diferentes regiões, se você executar todos os testes dentro de uma mesma LAN, pode ser que alguém em algum lugar faça algum tipo de cache, e você não simule realmente 50 mil usuários conectados ao redor do Brasil.

Para testes utilizando clusters, uma boa pedida é Amazon EC2 ou Digital Ocean, pois elas possuem máquinas em diferentes regiões. Claro existem outros provedores além destes, fica a seu critério de como montar os testes.