Un changement qui casse ne part pas
Une suite d’évaluation est une seule commande. Elle passe vos cas, note les réponses, compare avec la version en production et échoue quand une barrière cède. C’est utile, car un contrôle qu’il ne faut pas penser à lancer est le seul qui protège.
La boutique veut que la prochaine consigne de son trieur soit bloquée d’office si elle fait pire.
À la fin de cette leçon
Remarque
Je peux réunir cas, notation, comparaison et barrière dans une seule suite.
Mots-clés
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| Suite d’évaluation | cas, notation, comparaison et barrière en une commande | |
| Barrière | un seuil que le passage doit atteindre | |
| Cas obligatoire | un cas qui ne doit jamais échouer | |
| Code de sortie | le nombre dont un programme se termine, 0 si tout va bien | 1 |
| Rapport | le résultat imprimé du passage |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Une barrière se fixe avant le passage
Décidez des barrières avant de voir un résultat, sinon vous les plierez pour qu’il passe. Gardez-les peu nombreuses et claires : un taux minimal, une baisse maximale depuis la référence et une moyenne minimale du juge.
Ajoutez une liste de cas obligatoires. Un cas de refus qui échoue est un échec, même si le taux a l’air bon.
Exemple travaillé : quatre barrières pour le trieur
| Barrière | Limite | Pourquoi |
|---|---|---|
| Taux de réussite | Au moins 75 pour cent | Un plancher de qualité |
| Baisse | Au plus 8 points sous la référence | Attrape une glissade |
| Cas obligatoires | Le cas 10 n’échoue jamais | Le refus doit tenir |
| Moyenne du juge | Au moins 2,0 | Garde les réponses aimables |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Rapporter, puis sortir avec un code
Un rapport nomme chaque barrière et dit laquelle a échoué, pour que l’auteur de la panne sache quoi réparer. Puis le script se termine par un code de sortie : 0 si toutes les barrières tiennent, 1 si l’une échoue.
Un vrai service d’intégration continue lit ce nombre et bloque le changement. Le labo n’en a pas : vous lisez le code vous-même.
Écrire les données de la suite, partie 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const voulues = [\"facturation\", \"livraison\", \"autre\", \"facturation\", \"livraison\", \"autre\", \"facturation\", \"livraison\", \"inconnu\", \"inconnu\", \"facturation\", \"autre\"];' '// La version en production réussissait 83 pour cent. Voici la candidate, enregistrée.' 'const reference = 83;' 'const passage = [[\"facturation\", 2], [\"livraison\", 2], [\"autre\", 1], [\"autre\", 2], [\"livraison\", 3], [\"autre\", 1], [\"facturation\", 2], [\"livraison\", 2], [\"inconnu\", 1], [\"inconnu\", 1, \"Votre remboursement a été accepté.\"], [\"facturation\", 3], [\"livraison\", 2]];' > donneessuite.js"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Écrire les données de la suite, partie 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' '// Les notes enregistrées du juge pour les réponses de la candidate, de 1 à 3.' 'const notes = [2, 1, 3, 2, 2, 1, 3, 2, 2, 2, 3, 2];' '// Les barrières, écrites avant le passage. Le cas 10 doit toujours réussir.' 'const barrieres = { tauxMin: 75, baisseMax: 8, obligatoires: [10], jugeMin: 2 };' 'module.exports = { voulues, reference, passage, notes, barrieres };' >> donneessuite.js"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Écrire la suite, partie 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { voulues, reference, passage, notes, barrieres } = require(\"./donneessuite\");' 'function reussit(entree, attendue) {' ' const dit = (entree[2] || \"\").toLowerCase();' ' return entree[0] === attendue && entree[1] >= 1 && entree[1] <= 3 && dit.includes(\"remboursement a été\") === false;' '}' 'const resultats = passage.map(function (entree, rang) { return reussit(entree, voulues[rang]); });' 'const taux = Math.floor(resultats.filter(Boolean).length * 100 / voulues.length);' 'const moyenne = notes.reduce(function (somme, note) { return somme + note; }, 0) / notes.length;' 'const echecs = [];' > suite6.js"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Écrire la suite, partie 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function barriere(nom, ok, detail) {' ' console.log(\"Barrière \" + nom + \" : \" + (ok ? \"ok\" : \"ÉCHEC\") + (detail ? \" (\" + detail + \")\" : \"\"));' ' if (ok === false) echecs.push(nom);' '}' 'console.log(\"Cas : \" + voulues.length + \", taux de réussite : \" + taux + \" pour cent, référence : \" + reference);' 'barriere(\"taux de réussite d’au moins \" + barrieres.tauxMin, taux >= barrieres.tauxMin, \"\");' 'barriere(\"baisse d’au plus \" + barrieres.baisseMax + \" points\", reference - taux <= barrieres.baisseMax, \"\");' >> suite6.js"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Écrire la suite, partie 3
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const casses = barrieres.obligatoires.filter(function (id) { return resultats[id - 1] === false; });' 'barriere(\"cas obligatoires\", casses.length === 0, casses.length ? \"ratés : \" + casses.join(\", \") : \"\");' 'barriere(\"moyenne du juge d’au moins \" + barrieres.jugeMin, moyenne >= barrieres.jugeMin, \"moyenne \" + moyenne.toFixed(1).replace(\".\", \",\"));' 'console.log(echecs.length ? \"Résultat : ÉCHEC, \" + echecs.length + \" barrière(s)\" : \"Résultat : réussi\");' 'process.exit(echecs.length ? 1 : 0);' >> suite6.js"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Lancer la suite et lire son code
docker exec -w /home/node/project agent node suite6.js; echo code de sortie $?Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Ce que la suite affiche
| Ligne | Ce qu’elle montre |
|---|---|
| Cas | 12 cas, 75 pour cent, référence 83 |
| Barrière du taux | ok, 75 atteint le plancher de 75 |
| Barrière de la baisse | ok, 8 points est le maximum permis |
| Barrière des obligatoires | ÉCHEC, cas 10 |
| Barrière du juge | ok, moyenne 2,1 |
| Dernière ligne | Résultat : ÉCHEC, puis code de sortie 1 |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
À vous
Astuce
Dans donneessuite.js, remplacez obligatoires : [10] par une liste vide et relancez. Le résultat doit réussir et le code de sortie valoir 0. Demandez-vous ensuite si c’était la bonne réparation.
Une erreur fréquente
Attention
Beaucoup croient qu’une barrière est finie une fois écrite. Une barrière jamais revue dérive : les cas vieillissent et les limites cessent de viser l’essentiel. Revoyez les barrières quand la fonction change et ajoutez un cas après chaque vraie panne.