TL;DR — Résumé Rapide

Maîtrisez Grafana k6 pour les tests de charge et de performance. Utilisateurs virtuels, seuils, scénarios, CI/CD, tests navigateur et tableaux de bord Grafana.

Grafana k6 est un outil de test de charge centré sur le développeur qui exécute des scripts JavaScript sur un runtime Go haute performance. Cela vous offre la reproductibilité des tests en tant que code, la gestion de version et une intégration fluide avec CI/CD. Ce guide couvre tout, du premier smoke test aux scénarios de production avec métriques personnalisées, tests navigateur et tableaux de bord Grafana.

Prérequis

  • Node.js non requis — k6 possède son propre runtime JavaScript intégré (Goja, moteur ES6+ basé sur Go).
  • k6 installé — Homebrew, apt, Docker ou binaire de release.
  • Connaissance basique de JavaScript — fonctions, objets, boucles.
  • Un service cible — n’importe quelle API HTTP, serveur WebSocket ou endpoint gRPC.

Architecture de k6

k6 exécute des scripts JavaScript dans un runtime Go. Chaque utilisateur virtuel (VU) est une goroutine légère exécutant votre fonction default en boucle. Concepts clés :

  • VUs — Utilisateurs virtuels simultanés. Chacun exécute votre script indépendamment.
  • Itérations — Une exécution de la fonction default par un VU.
  • Checks — Assertions (comme status === 200). Les checks échoués n’arrêtent PAS le test.
  • Thresholds — Critères de réussite/échec (comme p(95) < 250). Les dépasser termine k6 avec le code 99.
  • Métriques — Intégrées (http_req_duration, http_reqs, vus) et personnalisées (Trend, Counter, Gauge, Rate).

Protocoles intégrés :

ProtocoleModuleNotes
HTTP/1.1 et HTTP/2k6/httpNégociation automatique HTTP/2
WebSocketk6/experimental/websocketsSupport complet des trames WS
gRPCk6/net/grpcUnaire et streaming
Redisk6/experimental/redisVia extension xk6-redis
Navigateurk6/browserVrai Chromium via Playwright

Types de Tests de Charge

Smoke test — vérifier que le script fonctionne

export const options = { vus: 1, duration: '30s' };

Load test — trafic normal attendu

export const options = {
  stages: [
    { duration: '2m', target: 100 }, // montée à 100 VUs
    { duration: '5m', target: 100 }, // palier
    { duration: '2m', target: 0   }, // descente
  ],
};

Stress test — au-delà de la capacité normale

export const options = {
  stages: [
    { duration: '2m', target: 100 },
    { duration: '5m', target: 200 },
    { duration: '2m', target: 300 }, // dépasser la normale
    { duration: '5m', target: 300 },
    { duration: '2m', target: 0   },
  ],
};

Spike test — pic soudain

export const options = {
  stages: [
    { duration: '10s', target: 1000 }, // pic instantané
    { duration: '1m',  target: 1000 },
    { duration: '10s', target: 0    }, // chute instantanée
  ],
};

Soak test — durée prolongée (trouver les fuites mémoire)

export const options = {
  stages: [
    { duration: '5m', target: 100 },
    { duration: '8h', target: 100 }, // soak de 8 heures
    { duration: '5m', target: 0   },
  ],
};

Breakpoint test — trouver la limite

export const options = {
  stages: [{ duration: '2h', target: 20000 }],
  thresholds: {
    http_req_failed: [{ threshold: 'rate<0.01', abortOnFail: true }],
  },
};

Seuils et Métriques Personnalisées

import { Trend, Rate } from 'k6/metrics';

const apiLatency = new Trend('api_latency', true);
const apiErrors  = new Rate('api_errors');

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

k6 vs Autres Outils

OutilLangageProtocolesModèle VUCI/CD
k6JavaScriptHTTP, WS, gRPC, BrowserGoroutineNatif
JMeterXML/GUIHTTP, JMS, FTP, JDBCThreadPlugin
GatlingScala/DSLHTTP, WSActeur asyncMaven/Gradle
LocustPythonHTTP, customCoroutine asyncCLI
ArtilleryYAML/JSHTTP, WSNode.jsNatif
wrkLuaHTTP seulementEpollManuel

Intégration CI/CD avec GitHub Actions

name: Load Test
on:
  push:
    branches: [main]
jobs:
  k6-load-test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Run k6 load test
        uses: grafana/k6-action@v0.3.1
        with:
          filename: tests/load/api.js
          flags: --vus 50 --duration 2m
        env:
          BASE_URL: ${{ secrets.STAGING_URL }}

k6 se termine avec le code 99 en cas de dépassement de seuil, faisant échouer l’étape Actions automatiquement.


Résumé

  • k6 exécute JavaScript sur un runtime Go — VUs légers, tests en tant que code, compatible Git.
  • Types de tests — smoke, load, stress, spike, soak, breakpoint — chacun ciblant un risque différent.
  • Thresholds imposent la réussite/l’échec en CI ; abortOnFail arrête les tests breakpoint incontrôlés.
  • Scénarios avec executors séparent le contrôle du taux d’arrivée du nombre de VUs.
  • SharedArray paramétrise les grands jeux de données sans surcharge mémoire par VU.
  • Tableau de bord Grafana 2587 visualise les résultats en temps réel depuis la sortie InfluxDB.

Articles Connexes