TL;DR
- k6 es una herramienta de load testing moderna y amigable — escribe tests en JavaScript
- Instala con brew/apt/docker, escribe scripts, corre desde CLI
- Define thresholds para criterios pass/fail: tiempo de respuesta, tasa de error
- Métricas integradas: http_req_duration, http_reqs, iterations, vus
- Integra con CI/CD, Grafana Cloud, InfluxDB para dashboards
Ideal para: Desarrolladores, DevOps, equipos que quieren tests de performance como código Omite si: Necesitas diseño GUI o protocolos exóticos (usa JMeter)
k6 es una herramienta de load testing open-source moderna con más de 20,000 estrellas en GitHub, diseñada para flujos de trabajo de desarrolladores e integración con CI/CD. Según el State of DevOps Report 2024, el 34% de las organizaciones ya tratan el performance testing como parte obligatoria de sus pipelines de CI. A diferencia de los test plans XML de JMeter, k6 usa JavaScript — los tests son legibles, versionables y revisables en pull requests. Una sola instancia de k6 puede generar miles de usuarios virtuales con overhead mínimo de memoria. Este tutorial cubre k6 desde la instalación hasta la integración avanzada con CI/CD: scripting en JavaScript, definición de thresholds, parametrización con variables de entorno y visualización de resultados en Grafana Cloud.
Tu equipo quiere tests de performance en CI/CD. Los archivos XML de JMeter son difíciles de revisar en PRs. Los tests necesitan correr headless en contenedores.
k6 resuelve esto. Los tests son código JavaScript — legibles, versionables, revisables. Corre desde CLI, integra con todo, reporta en tiempo real.
¿Qué es k6?
k6 es una herramienta de load testing open-source construida para workflows de desarrollo modernos. Tests en JavaScript, ejecución en Go (rápido), y resultados integran con herramientas de observabilidad.
Por qué k6:
- Tests en JavaScript — usa un lenguaje real, no XML
- Developer experience — excelente CLI, output claro
- Alto performance — una máquina maneja miles de VUs
- Nativo CI/CD — corre en contenedores
- Extensible — JavaScript APIs, extensiones, protocolos
Instalación
# macOS
brew install k6
# Ubuntu/Debian
sudo apt update && sudo apt install k6
# Docker
docker run --rm -i grafana/k6 run - <script.js
Tu Primer Test k6
Crea script.js:
import http from 'k6/http';
import { check, sleep } from 'k6';
export const options = {
vus: 10, // 10 usuarios virtuales
duration: '30s', // correr por 30 segundos
};
export default function () {
const res = http.get('https://test.k6.io');
check(res, {
'status is 200': (r) => r.status === 200,
'response time < 500ms': (r) => r.timings.duration < 500,
});
sleep(1);
}
Ejecutar:
k6 run script.js
Conceptos k6
Virtual Users (VUs)
VUs son ejecutores paralelos corriendo tu función de test.
export const options = {
vus: 100, // usuarios concurrentes
duration: '5m', // duración del test
};
Stages (Ramp-up/down)
Aumentar y disminuir carga gradualmente.
export const options = {
stages: [
{ duration: '2m', target: 100 }, // ramp a 100 usuarios
{ duration: '5m', target: 100 }, // mantener 100
{ duration: '2m', target: 200 }, // ramp a 200
{ duration: '2m', target: 0 }, // ramp down
],
};
Thresholds
Define criterios pass/fail.
export const options = {
thresholds: {
http_req_duration: ['p(95)<500'], // 95% requests < 500ms
http_req_failed: ['rate<0.01'], // tasa error < 1%
checks: ['rate>0.99'], // 99% checks pasan
},
};
HTTP Requests
GET Request
import http from 'k6/http';
export default function () {
// GET simple
const res = http.get('https://api.example.com/users');
// GET con parámetros
const res2 = http.get('https://api.example.com/users?page=1&limit=10');
// GET con headers
const res3 = http.get('https://api.example.com/users', {
headers: {
'Authorization': 'Bearer token123',
'Accept': 'application/json',
},
});
}
POST Request
import http from 'k6/http';
export default function () {
const payload = JSON.stringify({
name: 'John Doe',
email: 'john@example.com',
});
const params = {
headers: {
'Content-Type': 'application/json',
},
};
const res = http.post('https://api.example.com/users', payload, params);
}
Otros Métodos
// PUT
http.put(url, payload, params);
// PATCH
http.patch(url, payload, params);
// DELETE
http.del(url, params);
// Batch requests (paralelo)
const responses = http.batch([
['GET', 'https://api.example.com/users'],
['GET', 'https://api.example.com/products'],
['GET', 'https://api.example.com/orders'],
]);
Checks y Assertions
import { check } from 'k6';
export default function () {
const res = http.get('https://api.example.com/users');
check(res, {
'status is 200': (r) => r.status === 200,
'response has users': (r) => r.json().length > 0,
'response time OK': (r) => r.timings.duration < 500,
'content-type is JSON': (r) =>
r.headers['Content-Type'].includes('application/json'),
});
}
Datos de Test
Variables de Entorno
const baseUrl = __ENV.BASE_URL || 'https://test.k6.io';
export default function () {
http.get(`${baseUrl}/api/users`);
}
k6 run -e BASE_URL=https://staging.example.com script.js
Archivo JSON
import { SharedArray } from 'k6/data';
const users = new SharedArray('users', function () {
return JSON.parse(open('./data.json'));
});
export default function () {
const user = users[Math.floor(Math.random() * users.length)];
// usar user.username, user.password
}
Scenarios
Patrones de ejecución avanzados.
export const options = {
scenarios: {
// Carga constante
constant_load: {
executor: 'constant-vus',
vus: 50,
duration: '5m',
},
// Carga con ramp
ramping_load: {
executor: 'ramping-vus',
startVUs: 0,
stages: [
{ duration: '2m', target: 100 },
{ duration: '5m', target: 100 },
{ duration: '2m', target: 0 },
],
},
// Arrival rate constante
constant_rate: {
executor: 'constant-arrival-rate',
rate: 100,
timeUnit: '1s',
duration: '5m',
preAllocatedVUs: 50,
},
},
};
Métricas y Output
Métricas Integradas
| Métrica | Descripción |
|---|---|
| http_reqs | Total de HTTP requests |
| http_req_duration | Duración del request |
| http_req_failed | Tasa de requests fallidos |
| iterations | Iteraciones completadas |
| vus | Usuarios virtuales actuales |
| data_received | Datos recibidos |
| data_sent | Datos enviados |
Métricas Custom
import { Counter, Trend, Rate, Gauge } from 'k6/metrics';
const orderCounter = new Counter('orders_created');
const orderDuration = new Trend('order_duration');
const orderSuccess = new Rate('order_success_rate');
export default function () {
const start = Date.now();
const res = http.post('https://api.example.com/orders', orderPayload);
orderCounter.add(1);
orderDuration.add(Date.now() - start);
orderSuccess.add(res.status === 201);
}
Output a InfluxDB + Grafana
# Output JSON
k6 run --out json=results.json script.js
# Output a InfluxDB
k6 run --out influxdb=http://localhost:8086/k6 script.js
Integración CI/CD
GitHub Actions
name: Load Test
on:
push:
branches: [main]
jobs:
k6-test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run k6 test
uses: grafana/k6-action@v0.3.1
with:
filename: tests/load-test.js
flags: --out json=results.json
- name: Upload results
uses: actions/upload-artifact@v4
with:
name: k6-results
path: results.json
Docker
FROM grafana/k6
COPY ./tests /tests
ENTRYPOINT ["k6", "run", "/tests/script.js"]
docker build -t my-k6-tests .
docker run my-k6-tests
IA en k6 Testing
Las herramientas de IA pueden ayudar a escribir y optimizar tests k6.
Lo que la IA hace bien:
- Generar scripts de test desde specs de API
- Crear datos de test realistas
- Sugerir valores de thresholds
- Explicar métricas y resultados
Lo que aún necesita humanos:
- Entender arquitectura del sistema
- Establecer objetivos de carga realistas
- Interpretar resultados en contexto
- Debuggear fallos de performance
Prompt útil:
Genera un script de k6 load test para una REST API con endpoints: GET /users, POST /users, GET /users/{id}. Incluye stages para ramp-up a 100 VUs, thresholds para p(95) response time bajo 500ms y error rate menor a 1%, checks para status codes y validación de respuesta JSON.
“k6 cambió cómo pensamos el performance testing. Cuando los tests son código JavaScript, los desarrolladores los escriben y mantienen. Pasamos de ‘alguien debería ejecutar un load test’ a gates de performance en cada PR.” — Yuri Kan, Senior QA Lead
References: Documentación k6 | Grafana Cloud k6
FAQ
¿Qué es k6?
k6 es una herramienta de load testing moderna y open-source diseñada para desarrolladores. Escribes tests en JavaScript, los corres desde línea de comandos y obtienes métricas de performance detalladas. Construido por Grafana Labs, k6 se enfoca en developer experience, integración CI/CD y alto performance.
¿k6 es gratis?
Sí, k6 open-source (k6 OSS) es completamente gratis. Grafana Cloud k6 ofrece ejecución de tests hosteada, almacenamiento cloud y features adicionales con tiers gratis y pagos. Para la mayoría de casos, la versión open-source provee todo lo necesario.
¿k6 vs JMeter — cuál es mejor?
k6 es mejor para desarrolladores y workflows CI/CD — tests como código (JavaScript), ejecución rápida e integra bien con tooling moderno. JMeter es mejor para diseño de tests basado en GUI y soporta más protocolos out of the box. k6 es generalmente más fácil de aprender y mantener para equipos familiarizados con JavaScript.
¿Puede k6 testear interacciones de browser?
Sí, k6 tiene un módulo browser experimental que permite testing real con Chromium. Sin embargo, la fortaleza de k6 es testing a nivel protocolo (HTTP, WebSocket, gRPC) que es mucho más eficiente para load testing. Usa el módulo browser cuando necesites testear páginas renderizadas con JavaScript o interacciones complejas de browser.
¿Cómo ejecutar k6 en Docker?
Usa la imagen oficial de Grafana k6: docker run --rm -i grafana/k6 run - <script.js. Para scripts locales, monta tu directorio de tests: docker run --rm -v $(pwd):/scripts grafana/k6 run /scripts/test.js. Docker es la forma más fácil de ejecutar k6 en pipelines CI/CD sin instalar nada en la máquina host.
¿Qué métricas rastrea k6 por defecto?
k6 rastrea automáticamente http_reqs (total de requests), http_req_duration (tiempo de respuesta), http_req_failed (tasa de error), iterations (iteraciones completadas), vus (usuarios virtuales activos), data_received y data_sent. Puedes crear métricas custom usando tipos Counter, Trend, Rate y Gauge para mediciones específicas del negocio como órdenes creadas o tasa de éxito de login.
Ver También
- JMeter Tutorial - Load testing tradicional basado en GUI
- Gatling Load Testing - Testing de alta performance basado en Scala
- Locust Python Load Testing - Load testing basado en Python
- Performance Testing Guide - Fundamentos de performance testing
- Tutorial de API Testing - Guía completa de testing de API
- API Testing Arquitectura - Testing de API en microservicios
- Tutorial de Automatización de Tests - Fundamentos de automatización
- Selenium Tutorial - Automatización de navegador
- Cypress Tutorial - E2E testing para aplicaciones web
- Playwright vs Cypress - Comparación de frameworks E2E
