Quinze tests, tous verts
Un assistant de code peut écrire des tests pour une fonction en une minute. Ces tests passent tous, et cela rassure.
Pourtant, un test qui ne peut jamais échouer ne prouve rien. Cette leçon apprend à demander des tests à un assistant, puis à juger si chacun est capable de signaler une faute.
À la fin de cette leçon
Remarque
Je peux demander des tests à un assistant et juger si chacun peut vraiment échouer.
Mots-clés
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| Spécification | ce que le code doit faire, écrit avant le code | |
| Cas limite | une valeur au bord d’une règle | 9 et 10 articles |
| Test inutile | un test qui passe même quand le code est faux | |
| Recopie | un test dont la valeur attendue vient du code | |
| Code cassé exprès | une copie fausse, pour voir si les tests la repèrent |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Les tests partent de la règle
Donnez à l’assistant la règle écrite en phrases, pas seulement le code. Par exemple : « à partir de dix articles, 10 pour cent de remise ».
Demandez un cas pour chaque morceau de la règle et pour chaque bord. Un bord est la valeur où la règle change : ici 9 et 10. La valeur attendue vient de la règle. Si elle vient du code, le test ne peut qu’être d’accord avec lui.
Exemple travaillé : de la règle aux cas
| Cas | Articles | Attendu, en centimes | Ce que le cas vérifie |
|---|---|---|---|
| Un article | 1 | 150 | Le prix sans remise |
| Neuf articles | 9 | 1350 | Le dernier cas sans remise |
| Dix articles | 10 | 1350 | Le premier cas avec remise |
| Aucun article | 0 | 0 | Le plus petit cas |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Une demande possible
Voici une demande possible : « Voici la règle : 10 pour cent de remise dès dix articles. Écris des tests pour prix(quantite, centimes), un par ligne de ce tableau. Écris les valeurs attendues à la main, sans les calculer avec le code. »
Ce que l’assistant renvoie change d’une fois à l’autre. Relisez chaque test, et vérifiez d’abord que les bords y sont.
Un test doit pouvoir échouer
Pour savoir si un test sert à quelque chose, cassez le code exprès. Faites-en une copie avec une petite faute, puis lancez les mêmes tests dessus. Si tout passe encore, ces tests ne vous protègent de rien.
Les Run suivants écrivent dans un dossier demo-tests/ le bon code, une copie cassée et deux fichiers d’essais écrits à la main. Le dernier lance chaque essai sur chaque code. Ce ne sont pas des réponses d’un assistant.
Écrire le bon code
docker exec -w /home/node/project agent sh -c "mkdir -p demo-tests && printf '%s\n' '// Prix de quantite articles, en centimes. Remise de 10 pour cent des dix articles.' 'function prix(quantite, centimes) {' ' const brut = quantite * centimes;' ' if (quantite >= 10) return Math.round(brut * 0.9);' ' return brut;' '}' 'module.exports = { prix };' > demo-tests/remise.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 copie cassée
docker exec -w /home/node/project agent sh -c "mkdir -p demo-tests && printf '%s\n' '// Copie cassee expres : la remise ne commence qu’au-dela de dix articles.' 'function prix(quantite, centimes) {' ' const brut = quantite * centimes;' ' if (quantite > 10) return Math.round(brut * 0.9);' ' return brut;' '}' 'module.exports = { prix };' > demo-tests/remise-cassee.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 bons essais
docker exec -w /home/node/project agent sh -c "mkdir -p demo-tests && printf '%s\n' 'const prix = require(process.argv[2]).prix;' 'let echecs = 0;' 'function verifier(nom, vrai) {' ' if (vrai === false) {' ' echecs = echecs + 1;' ' console.log(\"echec : \" + nom);' ' }' '}' '// Cas tires de la regle, valeurs attendues ecrites a la main.' 'verifier(\"un article\", prix(1, 150) === 150);' 'verifier(\"neuf articles\", prix(9, 150) === 1350);' 'verifier(\"dix articles\", prix(10, 150) === 1350);' 'verifier(\"aucun article\", prix(0, 150) === 0);' 'console.log(\"bons.js sur \" + process.argv[2] + \" : \" + echecs + \" echec(s)\");' > demo-tests/bons.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 essais faibles
docker exec -w /home/node/project agent sh -c "mkdir -p demo-tests && printf '%s\n' 'const prix = require(process.argv[2]).prix;' 'let echecs = 0;' 'function verifier(nom, vrai) {' ' if (vrai === false) {' ' echecs = echecs + 1;' ' console.log(\"echec : \" + nom);' ' }' '}' '// Un calcul recopie du code qui etait sous les yeux, seuil compris.' 'function attendu(quantite, centimes) {' ' if (quantite > 10) return Math.round(quantite * centimes * 0.9);' ' return quantite * centimes;' '}' 'prix(10, 150);' 'verifier(\"sans comparer\", true);' 'verifier(\"est un nombre\", typeof prix(10, 150) === \"number\");' 'verifier(\"meme calcul\", prix(10, 150) === attendu(10, 150));' 'console.log(\"faibles.js sur \" + process.argv[2] + \" : \" + echecs + \" echec(s)\");' > demo-tests/faibles.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 chaque essai sur chaque code
docker exec -w /home/node/project/demo-tests agent sh -c "node bons.js ./remise.js; node bons.js ./remise-cassee.js; node faibles.js ./remise.js; node faibles.js ./remise-cassee.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.
Un test peut copier le code
Le troisième essai faible calcule la valeur attendue avec une copie du code, seuil compris. Il a été écrit en lisant la copie cassée, donc il copie sa faute. Il passe sur la copie cassée et échoue sur le bon code.
C’est la recopie. Elle arrive quand l’assistant a le code sous les yeux et que vous ne lui avez pas donné la règle. Une valeur attendue doit être un nombre écrit à la main.
Une erreur fréquente
Attention
Beaucoup pensent que plus il y a de tests, plus le code est sûr. Quinze tests qui ne peuvent pas échouer valent zéro. Comptez ce qu’un test peut attraper, pas leur nombre : cassez le code exprès et regardez qui rougit.
Exemple travaillé : quatre lancers
| Essais | Code | Affichage |
|---|---|---|
| bons.js | remise.js | bons.js sur ./remise.js : 0 echec(s) |
| bons.js | remise-cassee.js | echec : dix articles, puis 1 echec(s) |
| faibles.js | remise.js | echec : meme calcul, puis 1 echec(s) |
| faibles.js | remise-cassee.js | faibles.js sur ./remise-cassee.js : 0 echec(s) |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Plus loin : essayer sur un autre changement
C’est le bon moment pour essayer ces idées sur un autre changement. Ne touchez pas au bogue du labo, qui est le travail de la leçon 6. Essayez plutôt une nouvelle règle de remise dans une copie de shop.js.
Écrivez la règle en phrases, demandez des tests à l’assistant, puis cassez votre code exprès. Notez chaque test qui reste vert, et dites pourquoi il ne voit rien.