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:
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.