Teste de Performance - Introdução ao k6

Teste de Performance - Introdução ao k6

Introdução

Os testes de performance consistem em simular, num ambiente controlado e monitorado, um volume de transações ou usuários simultâneos, a fim de verificar como as aplicações, serviços, servidores, gateways e os demais componentes da infraestrutura irão se comportar e se atenderão aos requisitos de desempenho definidos. O objetivo mais comum desses testes é descobrir quão confiável, estável, eficiente e escalável é o sistema. É importante saber que existem diversos tipos de testes de performance que podem ser usados para diferentes necessidades do software. Os mais conhecidos são:

  • Teste de carga: esse tipo de teste tem como objetivo verificar o desempenho de um sistema quando é submetido a cargas variáveis de usuários ou transações. Com ele, podem ser identificados problemas de lentidão das aplicações ou serviços.
  • Teste de capacidade: muito similar ao teste de carga, tem como objetivo identificar os limites da aplicação, ou seja, quantos usuários simultâneos ou chamadas por segundo a aplicação é capaz de suportar dentro dos parâmetros de qualidade definidos.
  • Teste de Stress: esse tipo de teste tem o objetivo de verificar o comportamento da aplicação sob uma carga maior do que a esperada, e é ideal para identificar gargalos e capacidade do sistema ou aplicação.

Para esse tutorial, vou exemplificar como podemos fazer testes de carga utilizando o k6, mas antes disso, separei alguns tópicos interessantes sobre a ferramenta.

O que é?

O k6 é uma ferramenta de código aberto criada para otimizar o consumo mínimo de recursos do sistema e projetada para executar testes com alta carga em diferentes ambientes. Os casos de uso mais comuns do k6 são:

  • Teste de carga;
  • Teste de navegador;
  • Teste de caos e resiliência;
  • Desempenho e monitoramento sintético;

O k6 é escrito na linguagem de programação goja, que é uma implementação do JavaScript ES2015 (ES6) na linguagem Golang pura. Portanto, você pode usar JavaScript para escrever os testes no k6. Além disso, ele se destaca pela sua facilidade de configuração e pela capacidade de integração sem complicações com diversas soluções de automação, como Grafana, Datadog, Kafka entre outros, com dashboard, métricas e informações das execuções dos testes em tempo real.

Manifesto de Teste de Carga

O k6 também disponibiliza um Manifesto de Teste de Carga, que é o resultado de anos de estudo, sobre esses tipos de teste e que serve como orientação para equipes que desejam implementar testes de carga.

Limitações

Devido sua arquitetura, o k6 trás as seguintes restrições:

  • Não roda nativamente em um navegador;
  • Não roda em NodeJS;

Instalação

No meu caso, estou usando o sistema operacional Windows e fiz a instalação pelo gerenciador de pacotes Winget, do próprio Windows, pelo seguinte comando:

Mas caso você utilize outro sistema operacional, pode acessar a documentação oficial do k6 com o guia de instalação específico do Linux e Mac clicando aqui.

Criação dos cenários de teste

Para esse tutorial, estarei realizando um teste de carga utilizando uma API de teste chamada Advice Slip, que basicamente retorna um conselho(genialmente simples né?).

Após criado a pasta do projeto onde iremos armazenar nossos testes, iremos adicionar um arquivo chamado “get-advice.js” Esse arquivo será responsável por testar a chamada do endpoint “/advice”.

Antes de escrevermos nosso teste é importante saber que o k6 trabalha com o conceito de usuários virtuais (VUs), que executam scripts. Em termos gerais, mais usuários virtuais significam mais tráfego simulado. E para que um teste seja executado, você precisa ter uma função padrão que prepara o teste e o código VU, que faz as solicitações. 

Um exemplo simples que executa uma solicitação GET realizando em média aproximadamente 200 requisições em 2m 20s em um cenário com mais de 20VUs, se parece com este:

Rodando o k6

Podemos executar o teste localmente usando o seguinte comando:

Resultado da execução

Após executado o teste, teremos a seguinte saída:


Cada uma dessas métricas retornadas fornece uma perspectiva diferente sobre o desempenho, por exemplo:

http_reqs

Mede a quantidade de requisições.

http_req_failed

Mede a taxa de erro.

duração_req

Mede a duração.

Na documentação oficial do k6 é possível entender cada uma delas e até criar métricas personalizadas.

Exportar resultados

Também podemos fazer com que o k6 exporte os resultados em um formato CSV com o comando abaixo:

E você já conhecia o k6? Já utilizou em algum projeto? Conta pra mim :)


Referências bibliográficas

Grafana k6

Metrics

API performance testing with k6 | CircleCI

Teste de desempenho com k6 – Acervo Lima

Conhecendo o K6 para o teste de carga | by Daniel Jesus | Comunidade XP | Medium

Beginner’s Guide to Load Testing with k6 | by Mostafa Moradian | The Startup | Medium