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
defaultpar 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 :
| Protocole | Module | Notes |
|---|---|---|
| HTTP/1.1 et HTTP/2 | k6/http | Négociation automatique HTTP/2 |
| WebSocket | k6/experimental/websockets | Support complet des trames WS |
| gRPC | k6/net/grpc | Unaire et streaming |
| Redis | k6/experimental/redis | Via extension xk6-redis |
| Navigateur | k6/browser | Vrai 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
| Outil | Langage | Protocoles | Modèle VU | CI/CD |
|---|---|---|---|---|
| k6 | JavaScript | HTTP, WS, gRPC, Browser | Goroutine | Natif |
| JMeter | XML/GUI | HTTP, JMS, FTP, JDBC | Thread | Plugin |
| Gatling | Scala/DSL | HTTP, WS | Acteur async | Maven/Gradle |
| Locust | Python | HTTP, custom | Coroutine async | CLI |
| Artillery | YAML/JS | HTTP, WS | Node.js | Natif |
| wrk | Lua | HTTP seulement | Epoll | Manuel |
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 ;
abortOnFailarrê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.