Talking About TestingATT</>
Testes de Performance com k6

Acerte 100% do quiz para continuar

Aula
Prévia gratuita

Seu primeiro script k6

Escreva um script com a função default, http.get() e sleep(), execute-o e leia as métricas de resumo.

Um script k6 é um arquivo JavaScript. Esse é todo o truque, e é por isso que um testador que já escreve Cypress ou Playwright consegue ser produtivo com k6 em uma tarde.

O que muda não é a linguagem. O que muda é que o k6 pega o seu script e o executa várias e várias vezes, em muitas cópias simultâneas, medindo cada requisição HTTP que ele faz pelo caminho.

O menor script que faz alguma coisa

Crie um arquivo em k6/first-test.js com este conteúdo:

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

export default function () {
  http.get('http://localhost:3000/products')
  sleep(1)
}

Esse é um teste de performance completo e válido. Três coisas nele merecem nome.

A função default

A função exportada como default é o corpo do seu teste. O k6 a chama uma vez, depois de novo, e de novo, pelo tempo que o teste estiver configurado para rodar. Uma passagem por ela se chama iteração.

Essa é a maior mudança de mentalidade para quem vem de testes funcionais. No Cypress, seu teste roda uma vez e acabou. No k6, seu teste é o corpo de um laço que será executado milhares de vezes por centenas de usuários virtuais simultâneos, então tudo o que você colocar ali acontece milhares de vezes.

👨‍🏫 É também por isso que um script k6 não tem blocos it() ou test(). Não há nada para nomear, porque o mesmo código roda repetidamente. A unidade de organização no k6 é o cenário, não o caso de teste.

http.get()

O módulo k6/http é como você faz requisições. http.get(url) envia um GET e retorna um objeto de resposta com os campos que você esperaria:

const response = http.get('http://localhost:3000/products')

console.log(response.status)         // 200
console.log(response.timings.duration) // quanto tempo levou, em milissegundos
console.log(response.json('total'))  // lê um campo do corpo JSON

Toda requisição feita por esse módulo é medida automaticamente e entra nas métricas que o k6 imprime no final. Você não instrumenta nada por conta própria.

sleep()

sleep(1) pausa o usuário virtual por um segundo antes de ele iniciar a próxima iteração.

É tentador apagar isso e "testar com mais força". Não faça. Um usuário virtual sem sleep() não é um usuário, é um laço apertado, e vai gerar um padrão de requisições que nenhuma população real de humanos produziria. Vamos tratar disso a sério na aula sobre fluxos reais de usuário, onde o sleep() ganha seu nome de verdade: tempo de reflexão (think time).

Executando

k6 run k6/first-test.js

Por padrão, o k6 roda um usuário virtual por uma iteração e sai. Isso é proposital: a sua primeira execução deve dizer se o script funciona, não quão rápida é a API.

Lendo o resumo

Quando a execução termina, o k6 imprime um bloco de métricas. Reduzido ao que importa hoje:

     checks.........................: 0.00%  0 out of 0
     data_received..................: 12 kB  11 kB/s
     data_sent......................: 391 B  366 B/s
     http_req_duration..............: avg=8.42ms  min=8.42ms med=8.42ms max=8.42ms p(90)=8.42ms p(95)=8.42ms
     http_req_failed................: 0.00%  0 out of 1
     http_reqs......................: 1      0.93/s
     iteration_duration.............: avg=1.01s   min=1.01s  med=1.01s  max=1.01s  p(90)=1.01s  p(95)=1.01s
     iterations.....................: 1      0.93/s
     vus............................: 1      min=1        max=1

Quatro dessas linhas carregam quase todo o significado:

  • http_req_duration é quanto tempo as requisições levaram. É esse o número que as pessoas querem dizer quando falam "tempo de resposta".
  • http_req_failed é a taxa de erro. 0.00% aqui, e é a primeira coisa que você deve olhar, porque uma API rápida que está retornando erros não é rápida, é quebrada.
  • http_reqs é quantas requisições foram feitas, e a taxa por segundo ao lado é a sua vazão (throughput).
  • iterations é quantas vezes a sua função default rodou.

Note que avg, min, med, max e os percentis são todos o mesmo número. Com uma única requisição há apenas uma medição, então toda estatística a descreve. Isso muda no instante em que você adiciona um segundo usuário virtual, e ler essas colunas direito é justamente o assunto inteiro da aula Lendo os resultados.

👨‍🏫 Note também que iteration_duration é cerca de um segundo maior que http_req_duration. Esse é o seu sleep(1). O tempo de reflexão conta para a iteração, não para a requisição.

Visão geral dos comandos 📖

k6 run

Executa um script k6. Sem opções, ele executa uma iteração com um usuário virtual.

Sintaxe:

k6 run <caminho-do-script>

Exemplo:

k6 run k6/first-test.js

k6 run --vus --duration

Sobrescreve o número de usuários virtuais e por quanto tempo o teste roda, direto da linha de comando.

Sintaxe:

k6 run --vus <numero> --duration <tempo> <caminho-do-script>

Exemplo:

k6 run --vus 10 --duration 30s k6/first-test.js

Conteúdo sugerido 📚

Exercício 🎯

Escreva o k6/first-test.js você mesmo, execute-o e depois mude uma coisa de cada vez para ver o efeito de cada mudança no resumo:

  1. Rode do jeito que está, com a iteração única padrão.
  2. Rode de novo com --vus 5 --duration 10s e compare http_reqs e iterations.
  3. Remova o sleep(1), rode a versão de dez segundos novamente e observe o que aconteceu com http_reqs e com http_req_duration.
  4. Coloque o sleep(1) de volta.
🙊 No passo 3 você deve ver http_reqs saltar em cerca de uma ordem de grandeza, porque cinco usuários virtuais sem tempo de reflexão martelam a API tão rápido quanto ela consegue responder. Observe o http_req_duration subir junto: você não deixou a API mais lenta, você deixou a carga mais pesada. Essa é a primeira vez que você vai causar uma mudança de performance de propósito, e vale ficar um minuto pensando nisso.

A versão pronta deste script está no diretório k6/ do repositório do curso.

Mostre ao mundo o que você aprendeu 🌎

Para mostrar à sua rede profissional o que você aprendeu nesta aula, publique o seguinte no LinkedIn.

Estou fazendo o curso "Testes de Performance com k6" do @Walmyr Lima e Silva Filho na @Talking About Testing School, onde escrevi meu primeiro script k6 e aprendi a ler as métricas de resumo que ele imprime: tempo de resposta, taxa de erro, vazão e iterações. #TalkingAboutTesting #TATSchool #PerformanceTestingWithK6 #k6 #PerformanceTesting

👨‍🏫 Lembre-se de me marcar no seu post. Aqui está o meu perfil no LinkedIn.

Quiz

Pergunta 1 de 2
Pontuação: 0

Um script k6 não tem blocos `it()` nem `test()`, diferente de uma spec de Cypress ou Playwright. Por que não?

Acerte 100% do quiz para continuar