Um guia prático para entender e usar zombies stupid
Você já tentou configurar zombies stupid no seu ambiente de desenvolvimento? A coisa mais irritante é que a documentação oficial não cobre os casos mais comuns. Eu levei duas semanas para fazer funcionar no meu setup porque o tutorial básico pressupõe que você já tem uma versão anterior instalada, o que raramente é verdade.
Afinal, o que é zombies stupid?
É um framework open-source focado em automação de testes de carga com simulação de comportamento de usuários reais em ambientes distribuídos. A premissa original era simples: gerar tráfego realista sem depender de infraestrutura pesada. O problema é que a arquitetura evoluiu de forma orgânica e agora existem três sabores principais — o legacy, o clássico e o novo motor baseado em eventos assíncronos. Eu uso principalmente o motor async desde a versão 0.94, mas o legado ainda domina em projetos antigos. Se você está começando do zero, vá direto para o async. Perde cerca de 15% de throughput no benchmark inicial, mas ganha estabilidade quando o cenário ultrapassa mil usuários concorrentes.
Como instalar e rodar o primeiro teste
A instalação varia conforme o sistema operacional. No Linux, o caminho mais limpo é via pip ou compilando a partir do source. Eu recomendo o source porque as packages distribuídas nos repositórios padrão ficam desatualizadas rápido. A compilação leva uns dez minutos numa máquina decente. Depois de instalado, o comando básico é:
zs-stupid run --config meu_cenario.yaml --workers 4 O arquivo yaml define os passos do usuário, latência entre requisições e os endpoints. Aqui vai um exemplo minimalista que funcionou para mim:
scenario: login_test
endpoints:
- url: https://api.exemplo.com/login
method: POST
body: '{"user": "test", "pass": "123"}'
expected_status: 200
users: 50
ramp_up: 10
duration: 60s
Uma coisa que ninguém menciona na documentação é que o parâmetro ramp_up precisa ser menor que a metade do total de users. Se você colocar um valor maior, o framework entra em um loop de retry infinito e consome toda a memória disponível. Já vi isso acontecer em produção porque alguém copiou um template sem entender.
👉 Clique no botão abaixo para saber mais sobre o assunto!
Problemas reais que eu encontrei
O caso mais chato foi quando precisei rodar testes contra um endpoint que exige autenticação JWT com refresh token. O zombies stupid não trata renovação de token nativamente. Minha solução foi escrever um hook customizado em Python que intercepta a resposta 401, faz o refresh e retries a requisição original. Ficou assim:
@hook.on_response(status=401)
def refresh_and_retry(response):
new_token = call_refresh_endpoint()
response.headers['Authorization'] = f'Bearer {new_token}'
return response
Esse padrão de hook existe desde a versão 0.87, mas quase ninguém usa porque o exemplo mais comum no repositório é só um print do status code. Achei por acaso enquanto lia o código-fonte de um issue fechado em 2023.
Pegadinhas que você precisa saber
A primeira é sobre métricas. O framework gera dois tipos de dados: response_time_percentiles e throughput_per_second. Beginners costumam olhar só para o throughput e achar que tudo está bem, mas os percentis revelam caudas longas de latência que o throughput médio esconde. Sempre olhe o p95 e o p99 antes de qualquer conclusão. A segunda pegadinha é sobre concorrência real. O modo single-threaded com asyncio é suficiente para a maioria dos cenários, mas se seu teste envolve I/O pesado (como upload de arquivos grandes), migre para multi-processing. A diferença pode ser de 3 segundos para 45 segundos num cenário de 500 usuários enviando payloads de 5MB cada.
Alternativas e quando não usar
Existem outras ferramentas no mercado — k6, Locust, Gatling. Cada uma tem seus pontos fortes. Eu ainda prefiro zombies stupid quando preciso de customização profunda no fluxo de requisições, mas para times pequenos que querem resultado rápido, o Gatling roda em minutos e gera relatórios bonitos de cara. O zombies stupid falha completamente em cenários que exigem streaming de dados em tempo real. Se você precisa testar WebSockets com milhares de conexões simultâneas mantendo estado, vá de outra ferramenta. Já gastei horas tentando forçar isso e simplesmente não funciona — o motor de eventos não foi feito para keep-alive permanente.
zombies stupid para iniciantes: por onde começar
Comece com um cenário simples de leitura, sem autenticação. Rode com 10 usuários e 30 segundos de duração. Veja se consegue interpretar o relatório. Quando souber ler os dados, adicione complexidade gradualmente — autenticação, múltiplos endpoints, variáveis dinâmicas. Não tente pular etapas. Eu vi muita gente tentar rodar cenários com 10 mil usuários no primeiro dia e desistir porque deu erro em tudo. O framework é poderoso, mas exige que você entenda o básico de como HTTP funciona antes de abusar dos recursos avançados.
O download oficial está no GitHub do projeto. A versão mais recente estável é a 1.3.2, lançada em março deste ano. Versões mais novas ainda estão em beta e têm breaking changes na API de hooks. Se você não está disposto a debugar issues de compatibilidade, fique com a 1.3.2 por enquanto. Se algo não funcionar como esperado, a comunidade é pequena mas ativa nos issues do repositório. Respostas demoram cerca de três a cinco dias úteis, então tenha paciência. Não adianta postar "não funciona, me ajudem" sem logs e versão do sistema. A galera já viu de tudo e cobra informações concretas.