Testes de desempenho de uma aplicação Socket.IO

Se você está passando pela experiência de tentar fazer um teste de desempenho em sistemas que usam a biblioteca Socket.IO, uma das melhores formas é usar Locust, Taurus e BlazeMeter. Para saber mais sobre o tema, leia este artigo da December Labs, um dos patrocinadores gold da Quality Sense Conf.

Por December Labs

Sabemos que o JMeter é a ferramenta mais potente usada hoje em dia, e você vai encontrar rapidamente muita informação disponível. É a primeira ferramenta que vem à mente quando se pensa em fazer testes de desempenho, mas… pode acontecer de ela fazer você perder tempo, dinheiro e recursos. Estamos aqui para oferecer opções melhores para essa situação específica.

Sem mais delongas, vamos contar a experiência que tivemos:

Hoje em dia, as aplicações de chat são uma das principais ferramentas de comunicação: são simples de usar e eficazes, e uma ampla gama de pessoas de diferentes idades as aproveita. Por isso, é crucial encontrar a melhor ferramenta de testes de desempenho para garantir a permanência dos usuários e uma boa experiência com a aplicação.

As aplicações em tempo real (RTA) estão cada vez mais populares na nossa área. Essas aplicações funcionam em um intervalo de tempo que dá a ideia de comunicação instantânea, de modo que os usuários não precisam atualizar o app/site para receber novas mensagens. Exemplos famosos desse tipo de aplicação são os mensageiros instantâneos e chats como WhatsApp, Telegram e Facebook Messenger.

A biblioteca Socket.IO ficou muito popular na implementação desse tipo de app porque ajuda a melhorar a experiência do usuário. Grandes organizações, como Microsoft Office, Yammer, Zendesk, Trello e muitas outras, usam essa biblioteca JavaScript para criar sistemas sólidos em tempo real.

A popularidade do Socket.IO apresenta desafios significativos para os testers na criação de testes de benchmark robustos para esse tipo de sistema. A ideia é compartilhar um pouco da nossa experiência e de como foi a jornada para desenvolver esse tipo de teste.

O nosso objetivo inicial era desenvolver uma aplicação que suportasse 10.000 usuários simultâneos, com tempos de resposta dentro de uma faixa aceitável e, se existissem, encontrar gargalos.

Primeira rodada com JMeter

Começamos os testes de desempenho usando o JMeter como ferramenta principal porque é muito conhecido e tem a maior comunidade, popularidade e documentação. No entanto, logo começamos a enfrentar diferentes limitações:

❌A comunicação cliente-servidor não se restabelecia. ❌A interação com o servidor de resposta era complexa. ❌Havia problemas com a escala dos testes. ❌Os plugins não funcionavam como esperávamos.

Depois de um tempo, enfrentamos essas limitações e percebemos que havia soluções melhores que o JMeter. Nesse momento, começamos o processo de pesquisa, buscando novas tecnologias para alcançar o nosso objetivo. Por fim, encontramos algumas ferramentas novas que nos permitiram desenvolver o nosso script de teste para testar a aplicação Socket.IO.

Segunda rodada com Locust + Taurus + BlazeMeter

Descobrimos o Locust, uma ferramenta de linha de comando escrita em Python. Com ela, os testes de carga são distribuíveis e escaláveis, o que permite aumentar rapidamente um teste simulando milhares de usuários.

O Locust tem a vantagem de não exigir grandes arquivos de configuração, e testar a aplicação Socket.IO é mais simples do que com o JMeter. Para testers que preferem uma interface de linha de comando, o Locust é mais rápido e fácil de configurar, permitindo reutilizar facilmente o código de teste entre projetos. A linguagem para criar o teste é Python, que pode ser armazenado no seu sistema de controle de versão junto com o projeto, facilitando executar os mesmos testes de novo no futuro.

O primeiro passo para criar o nosso teste com o Locust foi desenvolver um cliente Socket.IO que simulasse os fluxos dos nossos usuários finais e agregasse valor aos nossos testes de desempenho. Como o objetivo final do teste era suportar um número alto de usuários simultâneos, tivemos que usar o BlazeMeter para aproveitar a sua infraestrutura e executar os testes na nuvem.

O BlazeMeter é uma ferramenta de testes de desempenho popular, baseada em SaaS e totalmente compatível com muitas ferramentas open source de testes de carga. Decidimos usar o BlazeMeter pelas vantagens que oferece, por exemplo:

✔️Uma forma simples de manter e executar os scripts a partir de um só lugar. ✔️A capacidade de gerar até 1.000.000 de usuários virtuais, sem se preocupar com custo e configuração de infraestrutura. ✔️Monitoramento e relatórios em tempo real. ✔️Acesso fácil a relatórios históricos.

Para poder executar os testes no BlazeMeter, tivemos que personalizar a imagem adicionando a biblioteca Socket.IO quando terminamos a execução no BlazeMeter. Se você está na mesma situação, pode se perguntar se é possível gerar relatórios do BlazeMeter ou obter gráficos de tempos de resposta, e a resposta talvez ainda seja não, ou pelo menos era há seis meses. Por isso, decidimos criar a versão mais recente dos nossos testes sem o BlazeMeter, usando só Locust e Taurus.

O Taurus (Test Automation Running Smoothly) é uma ferramenta de automação gratuita e aberta criada pela BlazeMeter, que oferece uma camada de abstração sobre os scripts de teste e nos dá uma forma amigável de desenvolver e configurar o script. A ideia inicial com o Taurus era usá-lo como mapeador entre o script do Locust e a infraestrutura do BlazeMeter, já que isso fazia parecer fácil construir a integração por meio das suas linguagens (JSON ou YML).

Algumas vantagens do Taurus:

✔️Instalação e configuração fáceis.
✔️Os testes são escritos em JSON ou YAML.
✔️Capacidade de executar scripts de teste existentes.
✔️Combinar facilmente vários scripts de teste em uma única execução.
✔️Relatórios em tempo real.
✔️Integração com o dashboard de relatórios do BlazeMeter.

Seguindo a ideia inicial de testar a aplicação com 10.000 usuários simultâneos, agora com o BlazeMeter fora do jogo, só com Locust e Taurus, começamos garantindo que tínhamos um computador com muitos recursos disponíveis. Também criamos um docker-compose com as configurações necessárias para executar os scripts do Locust e do Taurus, criando a possibilidade de executá-los em paralelo ou em computadores diferentes, caso seja preciso rodar mais usuários virtuais.

A nossa conclusão

No fim, conseguimos fazer um teste com a quantidade desejada de usuários virtuais. Também alcançamos os nossos objetivos trabalhando junto com a equipe de desenvolvimento. Eles corrigiram continuamente os problemas no nosso processo de teste para chegar aos nossos objetivos finais: um bom tempo de resposta, a eliminação de qualquer possível gargalo e, o mais importante, o suporte a 10.000 usuários virtuais simultâneos. Estudar as ferramentas disponíveis antes de começar cada teste sempre será necessário para garantir que você tenha os meios adequados para alcançar o objetivo final. Você consegue os melhores resultados analisando a realidade e escolhendo as ferramentas certas para criar testes robustos, escaláveis e confiáveis.

Se você está prestes a começar testes de desempenho com Socket.IO, esperamos que este artigo ajude!

Fique conectado

com a Abstracta

Notícias, artigos e recursos para construir software melhor.

Este site é protegido por reCAPTCHA e se aplicam a Política de Privacidade e os Termos de Serviço do Google.

Leia sobre nossa política de privacidade.

Ilustração de duas pessoas conectadas por uma ponte, uma com um notebook e outra com um tablet, representando colaboração e comunicação. Fim do artigo sobre socket.io.