Jump to content

Criando um teste de carga e um relatório de resultados personalizado com o K6


Kevin Silva

Postagens Recomendadas

Instalação e uso do K6

Primeiramente, é necessária a instalação do K6. Caso você esteja em um sistema Windows, é possível instalar por meio do instalador oficial recomendado pelo próprio K6.

Para o Fedora/CentOS, é possível instalar através dos comandos a seguir no terminal:

$ sudo dnf install https://dl.k6.io/rpm/repo.rpm
$ sudo dnf install k6

Para MACOS, é possível instalar através do homebrew:

$ brew install k6

Executando o K6

Crie um arquivo chamado script.js que contenha o código do teste de carga abaixo: 

// script.js

import http from 'k6/http';
import { sleep } from 'k6';

export default function () {
  http.get('https://test.k6.io');
  sleep(1);
}

Nele, há uma função em que um Usuário Virtual (VU) fará uma requisição GET para a URL de testes do K6 e assim que a requisição terminar de ser executada, será aguardado 1 segundo. Para executar o teste de carga, rode o comando abaixo no terminal:

$ k6 run script.js

Se a execução ocorrer com sucesso, a seguinte mensagem aparecerá quando ela acabar com os dados de execução dos testes:

http://wiki.tecnospeed.local/uploads/images/gallery/2022-12/scaled-1680-/image-1670871773985.png

Adicionando mais VUs

Em um teste de carga no K6, a carga refere-se à quantidade de VUs  que realizam uma determinada requisição ao mesmo tempo e por uma determinada duração. Dependendo do objetivo de aplicar um teste de carga no seu produto, será necessário aumentar ou diminuir a quantidade de VUs e/ou o total de tempo que esses VUs ficarão fazendo a requisição.

O K6 permite rodar o mesmo script acima mas com mais VUs e com uma duração maior já na linha de comando. No exemplo abaixo, 10 Vus farão a chamada da função definida em script.js durante 30 segundos:

$ k6 run --vus 10 --duration 30s script.js

O K6 trabalha com o conceito de usuários virtuais (VUs) que executam o seu script de teste. VUs seriam, em essência, loops de while (true) paralelos. Os scripts dos testes são feitos em JavaScript como módulos ES6, tornando possível quebrar testes grandes em partes menores que possam ser inclusive reutilizadas como desejar.

Para um teste ser executado, é preciso um init code para preparar o teste e o VU code, que faz as requisições. O init code define funções e configura as options do teste (como a duration por exemplo). Todo teste possui também uma default function que serve para definir um ponto de entrada para os VUs.

// init

export default function () {
  // vu code: fazer as coisas aqui...
}

Logo, ao invés de digitar --vus 10--duration 30s toda vez para o script acima, é possível definir diretamente no arquivo script.js:

import http from 'k6/http';
import { sleep } from 'k6';

export const options = {
  vus: 10,
  duration: '30s',
};

export default function () {
  http.get('http://test.k6.io');
  sleep(1);
}

E assim rodar o comando sem precisar passar parâmetros de options:

$ k6 run script.js

Stages: aumentando/diminuindo VUs

É possível aumentar e diminuir o número de VUs durante a execução do teste por meio do options.stages. No exemplo abaixo, há 3 estágios. O primeiro estágio tem uma duração de 30 segundos e tem o objetivo de elevar o número de VUs para um total de 20. Ou seja, começando com 0 VUs, o K6 elevará o número de VUs gradativamente e proporcionalmente ao duration estabelecido (30s). Somente no final do duration estabelecido que haverá 20 VUs fazendo requisições. Quanto menor o target e maior a duration, mais devagar será o aumento de VUs até que se atinja o valor do target (caso esse target seja maior do que 1).

No segundo estágio, a duração é de 1m30s e o target é de 10 VUs. Logo, até que se passem 1 minuto e 30 segundos, o K6 deverá diminuir a quantidade de VUs de 20 para 10 de maneira proporcional à esse tempo estabelecido. Por fim o último estágio é para a finalização do teste e em 20 segundos, o total de usuários deve cair de 10 VUs para 0 também de maneira proporcional.

Observa-se que na linha 14, há uma função check pertencente ao próprio K6. Ela é utilizada para analisar a resposta obtida da requisição e verificar se um determinado requisito foi correspondido após a execução do teste. No caso da linha 14, está sendo verificado  se o status retornado pela requisição GET foi 200 OK. Outras verificações podem ser feitas como mostra na documentação da ferramenta.

import http from 'k6/http';
import { check, sleep } from 'k6';

export const options = {
  stages: [
    { duration: '30s', target: 20 },
    { duration: '1m30s', target: 10 },
    { duration: '20s', target: 0 },
  ],
};

export default function () {
  const res = http.get('https://httpbin.test.k6.io/');
  check(res, { 'status was 200': (r) => r.status == 200 });
  sleep(1);
}

Modos de Execução

O K6 suporta 3 modos de execução de um teste de carga. Para saber mais sobre as configurações de cada modo de execução, clique em um dos links abaixo.

Local: a execução do teste acontece em uma única máquina, container ou servidor CI

$ k6 run script.js

Distribuído: a execução do teste é distribuída através de um cluster Kubernetes.

$ kubectl apply -f /path/k6-resource.yaml

 Cloud: a execução dos testes acontece no K6 Cloud

$ k6 cloud script.js

Saída dos Resultados

Por padrão, o K6 exibe os resultados para o stdout. Quando um teste é executado, o K6 exibe os detalhes dos resultados e das métricas usadas. Informações adicionais sobre o uso de métricas e o resumo dos resultados após o fim do teste estão presentes na documentação.

image.png

Ao invés de exibir os resultados via stdout, é possível gerar um relatório customizado com a função handleSummary().  No fim de um teste, o K6 automaticamente sempre cria um objeto que agrega todas as estatísticas dos resultados. Com handleSummary(), o objeto será processado como um relatório customizado em um formato desejado: JSON, HTML, XML e outros. No exemplo abaixo, é utilizado a extensão K6 Reporter para converter e apresentar os resultados em um relatório no formato HTML.

// script.js

import http from 'k6/http';
import { sleep } from 'k6';
import { htmlReport } from "https://raw.githubusercontent.com/benc-uk/k6-reporter/main/dist/bundle.js"

export function handleSummary(data) {
  return {
    "diretorio/para/salvar/arquivo/html/do/relatorio/resultados.html": htmlReport(data),
  }
};

export default function () {
  http.get('https://test.k6.io');
  sleep(1);
}

 Ao executar o script acima e abrir o arquivo gerado resultados.html, o relatório abaixo será exibido:

image.png

Além dos relatórios personalizados e do resumo padrão do stdout, é possível também fazer o streaming em tempo real dos dados obtidos em cada métrica durante a execução do teste em arquivos JSON, CSV ou em aplicações externas como Amazon CloudWatch ou o Grafana Cloud/ Prometheus.

  • Curtir 4
Link to comment
Compartilhe em outros sites

Crie uma conta ou entre para comentar 😀

Você precisa ser um membro para deixar um comentário.

Crie a sua conta

Participe da nossa comunidade, crie sua conta.
É bem rápido!

Criar minha conta agora

Entrar

Você já tem uma conta?
Faça o login agora.

Entrar agora


×
×
  • Create New...