Le test est vert, la faute est restée
Un test échoue. Vous demandez de l’aide à un assistant, il propose une correction, et le test passe. Vous pensez en avoir fini.
Pourtant, une correction qui ne fait taire que ce test peut laisser la faute en place. Cette leçon apprend à donner à un assistant ce qu’il lui faut pour déboguer, puis à vérifier que sa correction explique la faute.
À la fin de cette leçon
Remarque
Je peux donner à un assistant ce qu’il lui faut pour trouver une faute, et vérifier que sa correction l’explique.
Mots-clés
| Mot | Ce que ça veut dire |
|---|---|
| Cause | la raison de la faute, pas ce qu’on en voit |
| Cas signalé | le cas qui échoue et que vous avez trouvé |
| Cas de contrôle | un cas de plus, pour voir si la faute est partie |
| Rustine | une correction qui ne fait taire que le cas signalé |
| Un changement à la fois | une seule modification entre deux essais |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Donnez à l’assistant ce que vous avez
Écrire « ça ne marche pas » ne lui apprend rien. Joignez le test qui échoue avec son affichage exact, le code concerné, ce que vous avez déjà essayé et ce que vous attendiez.
Plus vous donnez de faits, moins l’assistant devine. Une faute qu’il devine, il la corrige parfois à la place d’une autre.
Ce qu’il faut joindre à la demande
| À joindre | Pourquoi |
|---|---|
| Le test et son affichage exact | Il montre la faute sans interprétation |
| Le code concerné, pas tout le projet | Il limite ce que l’assistant doit lire |
| Ce que vous avez déjà essayé | Il évite qu’on refasse la même piste |
| Ce que vous attendiez à la place | Il dit où est la faute |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Une demande possible
Voici une demande possible : « Ce test échoue : pages(11, 5) donne 2, j’attends 3. Voici la fonction. Je n’ai pas encore changé le code. Explique d’abord la cause, puis propose un seul changement. »
Ce que l’assistant renvoie change d’une fois à l’autre. Regardez surtout si son explication dit pourquoi 11 donne 2.
Écrire trois versions d’une fonction
docker exec -w /home/node/project agent sh -c "mkdir -p demo-debug && printf '%s\n' '// Nombre de pages pour total lignes, taille lignes par page.' 'function pages(total, taille) {' ' return Math.floor(total / taille);' '}' '// Une rustine : elle ne corrige que le cas qu’on a signale.' 'function rustine(total, taille) {' ' if (total === 11) return 3;' ' return Math.floor(total / taille);' '}' '// La correction qui explique la faute : on arrondit vers le haut.' 'function juste(total, taille) {' ' return Math.ceil(total / taille);' '}' 'module.exports = { pages, rustine, juste };' > demo-debug/pages.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 le contrôle
docker exec -w /home/node/project agent sh -c "mkdir -p demo-debug && printf '%s\n' 'const fonction = require(\"./pages.js\")[process.argv[2]];' '// Chaque cas : le nombre de lignes, puis le nombre de pages attendu (5 lignes par page).' 'const cas = [[11, 3], [1, 1], [12, 3], [10, 2], [15, 3], [0, 0]];' 'const combien = process.argv[3] === undefined ? cas.length : Number(process.argv[3]);' 'let echecs = 0;' 'for (const un of cas.slice(0, combien)) {' ' const obtenu = fonction(un[0], 5);' ' if (obtenu === un[1]) continue;' ' echecs = echecs + 1;' ' console.log(\"echec : pages(\" + un[0] + \", 5) donne \" + obtenu + \", attendu \" + un[1]);' '}' 'console.log(process.argv[2] + \" : \" + echecs + \" echec(s) sur \" + combien);' > demo-debug/controle.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 le seul cas signalé
docker exec -w /home/node/project/demo-debug agent node controle.js pages 1Affiché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.
Demandez la cause avant le correctif
Demandez d’abord pourquoi la faute arrive, puis le changement. Une cause bien dite prédit d’autres échecs. Ici, une division qui arrondit vers le bas laisse aussi 1 ligne sans page et 12 lignes avec une page de moins.
Vérifiez cette prédiction avant de changer quoi que ce soit. Si l’explication n’en annonce aucune autre, elle est peut-être fausse.
Une seule modification entre deux essais
Changez une chose, puis relancez. Si vous en changez trois, vous ne saurez pas laquelle a servi, ni laquelle a fait un nouveau dégât.
Puis relancez plus que le cas signalé. Une rustine passe le cas signalé et échoue sur les autres. Seul un jeu de cas de contrôle la démasque.
Essayer la rustine, puis la correction juste
docker exec -w /home/node/project/demo-debug agent sh -c "node controle.js rustine 1; node controle.js rustine; node controle.js juste"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.
Une erreur fréquente
Attention
Beaucoup pensent qu’un test qui repasse au vert veut dire que la faute est corrigée. Il montre seulement que ce cas passe. Gardez toujours quelques cas de contrôle, et demandez à l’assistant de dire pourquoi sa correction marche.
Exemple travaillé : trois essais
| Version | Cas signalé | Les six cas |
|---|---|---|
| pages | échoue : 2 au lieu de 3 | trois échecs : 11, 1 et 12 |
| rustine | réussit | deux échecs : 1 et 12 |
| juste | réussit | aucun échec |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Plus loin : essayer sur une autre faute
C’est le bon moment pour essayer ces idées sur une autre faute. Ne touchez pas au bogue du labo, qui est le travail de la leçon 6. Ajoutez plutôt vous-même une faute dans une copie de shop.js.
Joignez le test et son affichage, demandez la cause avant le changement, puis lancez des cas de contrôle. Notez si la correction proposée expliquait vraiment la faute.