Acerte 100% do quiz para continuar
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 blocosit()outest(). 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 JSONToda 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.jsPor 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=1Quatro 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 queiteration_durationé cerca de um segundo maior quehttp_req_duration. Esse é o seusleep(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.jsk6 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.jsConteúdo sugerido 📚
- Executando o k6 - documentação oficial
- O módulo k6/http - documentação oficial
- Ciclo de vida do teste - documentação oficial
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:
- Rode do jeito que está, com a iteração única padrão.
- Rode de novo com
--vus 5 --duration 10se comparehttp_reqseiterations. - Remova o
sleep(1), rode a versão de dez segundos novamente e observe o que aconteceu comhttp_reqse comhttp_req_duration. - Coloque o
sleep(1)de volta.
🙊 No passo 3 você deve verhttp_reqssaltar 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 ohttp_req_durationsubir 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óriok6/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
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