Fondamentaux et Scripting¶
Module 3 : Structuration et Organisation¶
3.1 Groupes et Organisation¶
Avantages des groupes
- Structurer le Test : Organise le script de charge en étapes logiques ou scénarios utilisateur (ex: Connexion, Ajouter au panier).
- Lisibilité : Rend les scripts longs faciles à lire et à maintenir.
- Utile pour : Connaître la performance de l'expérience utilisateur complète (plus pertinent qu'une seule requête HTTP).
- Tagging Automatique : Applique un tag group (avec le nom du groupe) à toutes les métriques (requêtes, vérifications) générées à l'intérieur. Permet de filtrer, agréger et visualiser les résultats dans Grafana par fonctionnalité ou étape.
import { group, check } from 'k6';
import http from 'k6/http';
export default function () {
group('01_Visiter la Page d\'Accueil', function () {
const res = http.get('https://example.com/');
check(res, { 'status est 200': (r) => r.status === 200 });
// La durée de cette requête est incluse dans 'group_duration{"group":"01_Visiter la Page d'Accueil"}'
});
group('02_Processus d\'Achat', function () {
// Un groupe peut contenir d'autres groupes (imbrication)
group('02a_Ajouter au Panier', function () {
// Requêtes et vérifications liées à l'ajout
});
group('02b_Procéder au Paiement', function () {
// Requêtes et vérifications liéess au paiement
});
});
}
3.1 Groupes et Organisation¶
Groupe & Threshold
import http from 'k6/http';
import { group, sleep } from 'k6';
export const options = {
thresholds: {
'group_duration{group:::Group1}': ['avg < 400'],
'group_duration{group:::Group2}': ['avg < 200'],
},
vus: 1,
duration: '10s',
};
export default function () {
group('Group1', function () {
http.get('http://example.com');
});
group('Group2', function () {
...
});
sleep(1);
}
3.1 Groupes et Organisation¶
Groupe, Threshold & tags
import http from 'k6/http';
import { sleep } from 'k6';
import { Rate } from 'k6/metrics';
export const options = {
thresholds: {
'http_req_duration{type:GET}': ['p(95)<500'], // threshold on GET seulement
'http_req_duration{type:GET_BATCH}': ['p(95)<200'], // threshold on GET_BATCH seulement
},
};
export default function () {
const res1 = http.get('http://example.com', {
tags: { type: 'GET' },
});
const res2 = http.get('http://example.com', {
tags: { type: 'GET' },
});
const responses = http.batch([
[
'GET',
'http://example.com',
null,
{ tags: { type: 'GET_BATCH' } },
],
['GET', 'http://example.com', null, { tags: { type: 'GET_BATCH' } }],
]);
sleep(1);
}
3.2 Options de Configuration¶
Options principales
export const options = {
// Utilisateurs virtuels et durée
vus: 10,
duration: '30s',
// Itérations
iterations: 100,
// Seuils (thresholds)
thresholds: {
http_req_duration: ['p(95)<500'], // 95% des requêtes < 500ms
http_req_failed: ['rate<0.01'], // Moins de 1% d'erreurs
},
// Tags
tags: {
environment: 'staging',
team: 'backend',
},
// No Connection Reuse
noConnectionReuse: false,
// User Agent
userAgent: 'K6TestAgent/1.0',
// Max Redirects
maxRedirects: 4,
// Batch
batch: 10,
batchPerHost: 6,
};
3.3 Gestion des Cookies et Sessions¶
Cookies automatiques
Aucun besoin de base d'écrire de code spécifique pour gérer les cookies, car le module http les gère lui-même (il maintient un cookie jar pour chaque utilisateur virtuel - VU)
import http from 'k6/http';
import { check } from 'k6';
export default function () {
// Première requête : le serveur définit un cookie
const res = http.get('https://example.com/login');
check(res, {
'statut 200': (r) => r.status === 200,
'le cookie de session est défini': (r) => r.headers['Set-Cookie'] !== undefined,
});
const jar = http.cookieJar();
// jar.cookiesForURL() retourne un objet : { nom_cookie: ['valeur1', 'valeur2'] }
const sessionCookies = jar.cookiesForURL(res.url);
const sessionID = sessionCookies['session_id'] ? sessionCookies['session_id'][0] : 'non trouvé';
console.log(`ID de session récupéré : ${sessionID}`);
}
Cet ID sera automatiquement envoyée dans les requêtes suivantes vers le même domaine
3.3 Gestion des Cookies et Sessions¶
Gestion manuelle des cookies
import http from 'k6/http';
export default function () {
const jar = http.cookieJar();
const targetURL = 'https://example.com/profil';
// jar.set(url, name, value, options)
jar.set(targetURL, 'user_pref_theme', 'dark', {
domain: 'example.com',
path: '/',
secure: true,
max_age: 3600, // Expiration en secondes
});
// La requête suivante vers 'targetURL' inclura automatiquement ce cookie dans l'en-tête 'Cookie'.
const res = http.get(targetURL);
console.log(`Cookie 'user_pref_theme=dark' a été envoyé.`);
}
3.3 Gestion des Cookies et Sessions¶
Gestion manuelle des cookies - requête individuelle
import http from 'k6/http';
export default function () {
// Le cookie est envoyé uniquement dans cette requête, et non enregistré pour les suivantes.
const res = http.get('https://example.com/page', {
cookies: {
'user_pref_theme': 'dark'
}
});
}
3.3 Gestion des Cookies et Sessions¶
Exercice pratique
Objectif : Créer un scénario d'authentification
- Implémenter une connexion qui retourne un token/cookie
- Utiliser ce token pour des requêtes authentifiées
- Grouper les actions par fonctionnalité
- Ajouter des checks appropriés