Skip to main content

k6 | Test & QA

  • k6 | Test & QA

O k6 é uma ferramenta moderna para testes de carga e performance de APIs e aplicações HTTP. Os testes são escritos em JavaScript e executados via CLI ou Docker.


Instalação

# Mac
brew install k6

# Linux (Debian/Ubuntu)
sudo apt install k6

# Windows (Chocolatey)
choco install k6

# Docker
docker run -i grafana/k6 run - <script.js>

Estrutura Básica de um Teste

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

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

export default function () {
let res = http.get('https://test.k6.io');

check(res, {
'status == 200': (r) => r.status === 200,
});

sleep(1);
}

Componentes principais

ElementoDescrição
optionsDefine configuração de carga
default functionExecutado por cada VU
httpMódulo para requisições
check()Assertivas
sleep()Pausa entre execuções

Ramp-up (Carga Progressiva)

export let options = {
stages: [
{ duration: '30s', target: 10 },
{ duration: '1m', target: 50 },
{ duration: '30s', target: 0 },
],
};

Permite simular crescimento gradual de usuários.


Thresholds (SLOs)

export let options = {
thresholds: {
http_req_duration: ['p(95)<500'],
http_req_failed: ['rate<0.01'],
},
};

Define critérios de sucesso do teste.


Cenários Múltiplos

export let options = {
scenarios: {
login_users: {
executor: 'constant-vus',
exec: 'login',
vus: 20,
duration: '1m',
},
search_users: {
executor: 'ramping-vus',
exec: 'search',
startVUs: 0,
stages: [
{ duration: '30s', target: 10 },
{ duration: '1m', target: 10 },
{ duration: '30s', target: 0 },
],
},
},
};

Autenticação com Token

import http from 'k6/http';

export default function () {
http.get('https://api.site.com/protected', {
headers: {
Authorization: `Bearer ${__ENV.TOKEN}`,
},
});
}

Executando:

TOKEN=abc123 k6 run script.js

Dados Externos

import { SharedArray } from 'k6/data';

const users = new SharedArray('users', () =>
JSON.parse(open('./users.json'))
);

export default function () {
const user = users[__VU % users.length];
http.post('https://api.site.com/login', JSON.stringify(user));
}

Exportação de Métricas

k6 run script.js --out json=results.json
k6 run script.js --out influxdb=http://localhost:8086/k6

Exemplo Completo com Login e Requisições

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

export default function () {
let loginRes = http.post(
'https://api.site.com/login',
JSON.stringify({ user: 'usuario', pass: 'senha' }),
{ headers: { 'Content-Type': 'application/json' } }
);

check(loginRes, { 'login 200': (r) => r.status === 200 });

let token = loginRes.json('token');

const headers = {
Authorization: `Bearer ${token}`,
'Content-Type': 'application/json',
};

let res = http.get(
'https://api.site.com/search?q=performance',
{ headers }
);

check(res, { 'search 200': (r) => r.status === 200 });

sleep(1);
}

Exemplo Real com Geração de CNPJ

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

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

export default function () {
const formData = {
ativo: true,
id: "12345678000195",
nome: "teste",
estado: "sp"
};

const headers = {
'Content-Type': 'application/json',
'Authorization': `Bearer x.x.x-x`,
};

let res = http.post(
'http://localhost:21229/api/gerenciamento/cidade/adicionar',
JSON.stringify(formData),
{ headers }
);

check(res, { 'status == 200': (r) => r.status === 200 });

sleep(1);
}

Parâmetros do Comando k6

ParâmetroDescriçãoExemplo
--vusDefine número de VUs--vus 50
--durationDefine duração total--duration 1m
--iterationsNúmero total de execuções--iterations 1000
--outExporta métricas--out json=result.json
--envDefine variável de ambiente--env TOKEN=abc123
--tagAdiciona tag personalizada--tag env=prod
--http-debugMostra debug HTTP--http-debug full
--summary-exportExporta resumo em JSON--summary-export=summary.json
--no-thresholdsIgnora thresholds--no-thresholds
--no-usage-reportDesativa relatório de uso--no-usage-report

Exemplo Completo de Execução

k6 run script.js \
--vus 50 \
--duration 2m \
--env TOKEN=abc123 \
--out json=results.json

Estrutura Recomendada para Projetos

/k6
├── scripts/
│ ├── login.js
│ ├── search.js
├── data/
│ ├── users.json
├── results/
├── docker-compose.yml

Separar scripts e dados melhora manutenção e escalabilidade dos testes.