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
| Elemento | Descrição |
|---|---|
options | Define configuração de carga |
default function | Executado por cada VU |
http | Mó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âmetro | Descrição | Exemplo |
|---|---|---|
--vus | Define número de VUs | --vus 50 |
--duration | Define duração total | --duration 1m |
--iterations | Número total de execuções | --iterations 1000 |
--out | Exporta métricas | --out json=result.json |
--env | Define variável de ambiente | --env TOKEN=abc123 |
--tag | Adiciona tag personalizada | --tag env=prod |
--http-debug | Mostra debug HTTP | --http-debug full |
--summary-export | Exporta resumo em JSON | --summary-export=summary.json |
--no-thresholds | Ignora thresholds | --no-thresholds |
--no-usage-report | Desativa 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.