Performance Testing con k6: Guía Completa para Principiantes

Aprende los fundamentos del performance testing utilizando k6, desde la configuración básica hasta la implementación de pruebas avanzadas.

Performance Testing con k6: Guía Completa para Principiantes

El performance testing es una disciplina crítica en el desarrollo de software moderno. En este artículo, te guiaré a través de los fundamentos de k6, una herramienta moderna y poderosa para testing de performance.

¿Qué es k6?

k6 es una herramienta de testing de performance desarrollada por Grafana Labs. A diferencia de herramientas tradicionales como JMeter, k6 está diseñado para desarrolladores y utiliza JavaScript como lenguaje de scripting.

Ventajas de k6:

  • Scripts en JavaScript: Fácil de aprender y mantener
  • Alto rendimiento: Capaz de generar miles de usuarios virtuales
  • Integración con CI/CD: Perfecto para automatización
  • Métricas detalladas: Reportes completos y visualizaciones

Configuración Inicial

Instalación

# Instalación en macOS
brew install k6

# Instalación en Windows
choco install k6

# Instalación en Linux
sudo gpg -k
sudo gpg --no-default-keyring --keyring /usr/share/keyrings/k6-archive-keyring.gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys C5AD17C747E3415A3642D57D77C6C491D6AC1D69
echo "deb [signed-by=/usr/share/keyrings/k6-archive-keyring.gpg] https://dl.k6.io/deb stable main" | sudo tee /etc/apt/sources.list.d/k6.list
sudo apt-get update
sudo apt-get install k6

Tu Primer Script

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

export let options = {
  stages: [
    { duration: '2m', target: 100 }, // Ramp up
    { duration: '5m', target: 100 }, // Stay at 100 users
    { duration: '2m', target: 0 },   // Ramp down
  ],
};

export default function () {
  let response = http.get('https://httpbin.org/get');
  
  check(response, {
    'status is 200': (r) => r.status === 200,
    'response time < 500ms': (r) => r.timings.duration < 500,
  });
}

Configuración Avanzada

Escenarios de Carga

export let options = {
  scenarios: {
    load_test: {
      executor: 'ramping-vus',
      startVUs: 0,
      stages: [
        { duration: '30s', target: 10 },
        { duration: '1m', target: 50 },
        { duration: '30s', target: 0 },
      ],
    },
    stress_test: {
      executor: 'ramping-vus',
      startVUs: 0,
      stages: [
        { duration: '2m', target: 100 },
        { duration: '5m', target: 100 },
        { duration: '2m', target: 200 },
        { duration: '5m', target: 200 },
        { duration: '2m', target: 0 },
      ],
    },
  },
};

Manejo de Datos

import { SharedArray } from 'k6/data';

const testData = new SharedArray('users', function () {
  return JSON.parse(open('./users.json'));
});

export default function () {
  const user = testData[Math.floor(Math.random() * testData.length)];
  
  let response = http.post('https://api.example.com/login', {
    username: user.username,
    password: user.password,
  });
}

Mejores Prácticas

1. Configuración de Thresholds

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

2. Manejo de Errores

export default function () {
  let response = http.get('https://api.example.com/data');
  
  if (response.status !== 200) {
    console.error(`Error: ${response.status} - ${response.body}`);
    return;
  }
  
  // Procesar respuesta exitosa
  let data = response.json();
  check(data, {
    'data is valid': (d) => d.id !== undefined,
  });
}

3. Autenticación y Sesiones

export default function () {
  // Login
  let loginResponse = http.post('https://api.example.com/login', {
    username: 'testuser',
    password: 'testpass',
  });
  
  let token = loginResponse.json('token');
  
  // Usar token en requests posteriores
  let headers = {
    'Authorization': `Bearer ${token}`,
    'Content-Type': 'application/json',
  };
  
  let dataResponse = http.get('https://api.example.com/data', { headers });
}

Integración con CI/CD

GitHub Actions

name: Performance Tests
on: [push, pull_request]

jobs:
  performance:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Run k6 tests
        run: |
          k6 run --out json=results.json tests/load-test.js
      - name: Upload results
        uses: actions/upload-artifact@v2
        with:
          name: k6-results
          path: results.json

Métricas y Reportes

k6 proporciona métricas detalladas que puedes usar para análisis:

  • http_req_duration: Tiempo de respuesta de requests
  • http_req_failed: Tasa de fallos
  • http_reqs: Requests por segundo
  • vus: Usuarios virtuales activos
  • iterations: Número de iteraciones completadas

Conclusión

k6 es una herramienta poderosa y moderna para performance testing. Su enfoque en JavaScript y la facilidad de integración con CI/CD lo convierten en una excelente opción para equipos de desarrollo modernos.

En próximos artículos, profundizaré en temas más avanzados como:

  • Testing de APIs REST y GraphQL
  • Integración con herramientas de monitoreo
  • Optimización de scripts para máximo rendimiento
  • Casos de estudio reales

¿Te interesa algún tema específico? ¡Déjame saber en los comentarios!


¿Necesitas ayuda con performance testing en tu proyecto? Contáctame y trabajemos juntos para optimizar tu aplicación.