Files
Johan LEROY 2ed9e1cee4 test(charge): mesure l'API sous charge avec k6
Aucun garde-fou de performance n'existait, et le dépôt ne chiffrait aucun temps de réponse.

tests/load, quatre scénarios :
- smoke : une minute sur chaque route de lecture, joué à chaque PR ;
- charge : 50 utilisateurs, 40 sur le tableau de bord au rythme de son rafraîchissement,
  10 qui explorent les sites ;
- stress : débit croissant jusqu'à la rupture, arrêt au-delà de 10 % d'erreurs ;
- limitation-debit : par le proxy, vérifie que nginx répond 429 et jamais 5xx.

Seuils : p95 < 500 ms et p99 < 1 s sur les lectures, moins de 1 % d'échecs.

k6 tourne en service Compose (profil load) sur le réseau du projet : il vise backend:8000 et
mesure l'API plutôt que la limite de 20 req/s par adresse de nginx. Chaque tir écrit un rapport
HTML, une synthèse Markdown et le JSON brut dans tests/load/results.

make load-smoke, load-test, load-stress et load-limits ; le job E2E enchaîne le smoke et le
test de limitation après Playwright.

Closes #47
2026-09-23 09:29:20 +02:00

30 lines
794 B
JavaScript

import { sleep } from 'k6';
import { auHasard, consulterSite, lire, preparer } from './lib/api.js';
import { SEUILS, STATISTIQUES } from './lib/config.js';
import { rapport } from './lib/rapport.js';
export const options = {
insecureSkipTLSVerify: true,
scenarios: {
smoke: { executor: 'constant-vus', vus: 2, duration: '1m' },
},
thresholds: SEUILS,
summaryTrendStats: STATISTIQUES,
};
export const setup = preparer;
export default function (data) {
lire('/stats/summary', 'stats_summary', data.jeton);
lire('/predictions', 'predictions', data.jeton);
lire('/alerts', 'alerts', data.jeton);
lire('/sites', 'sites', data.jeton);
consulterSite(auHasard(data.sites), data.jeton);
sleep(1);
}
export function handleSummary(data) {
return rapport('smoke', data);
}