Un bogue corrigé peut revenir
Une régression est un bogue qui revient après avoir été corrigé, ou une fonction qui marchait et s’arrête après un changement. Un test de régression est un test écrit pour un seul bogue, afin qu’il ne revienne jamais en silence.
Dans cette leçon, un client signale un bogue. Vous écrivez d’abord le test, puis la correction.
À la fin de cette leçon
Remarque
Je peux transformer un signalement de bogue en test qui échoue, corriger le bogue et garder le test.
Mots-clés
| Mot | Ce que ça veut dire |
|---|---|
| Régression | un bogue qui revient, ou une fonction qui s’arrête après un changement |
| Test de régression | un test écrit pour un bogue signalé et gardé pour de bon |
| Signalement | ce que dit l’utilisateur, avec l’entrée qui a causé le problème |
| Rouge | un lancement où un test échoue |
| Vert | un lancement où tous les tests passent |
| Cas voisin | une entrée proche de celle du signalement, pour voir si la correction a seulement déplacé le bogue |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Transformer un signalement en test
Une boutique accorde un dixième de remise à toute commande de 100 euros ou plus. Un client écrit : « J’ai dépensé exactement 100 euros et je n’ai eu aucune remise. »
Ce signalement contient l’entrée : 10000 centimes. La boutique compte en centimes pour qu’aucun prix ne soit une fraction. Créez d’abord le dossier et le code tel qu’il est aujourd’hui, avec la faute dedans.
Créer un dossier pour la leçon
mkdir -p ~/regressionAffiché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.
Entrer dans le dossier
cd ~/regressionAffiché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 code de la boutique tel quel
printf 'def remise(total_centimes):\n if total_centimes > 10000:\n return total_centimes // 10\n return 0\n' > boutique.pyAffiché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 test avant la correction
Transformez le signalement en test avec exactement l’entrée du client. Nommez-le d’après ce que le client a vu, pour qu’un échec se lise comme le signalement.
Lancez-le avant de corriger quoi que ce soit. Il doit échouer. Un test qui passe sur le code fautif ne prouverait rien.
Écrire le test du signalement
printf 'import unittest\nfrom boutique import remise\n\n\nclass SignalementRemise(unittest.TestCase):\n def test_exactement_100_euros_recoit_un_dixieme(self):\n self.assertEqual(remise(10000), 1000)\n' > test_boutique.pyAffiché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.
Le lancer et le voir échouer
python3 -m unittest test_boutique 2>&1 | grep -E "^(OK|FAILED|AssertionError)"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.
Corriger seulement ce que montre le test
Le code écrit > là où la règle dit « ou plus ». Changez-le en >= et rien d’autre. Puis relancez le test. Il doit passer au vert.
Changer le signe supérieur à
sed -i 's|total_centimes > 10000|total_centimes >= 10000|' boutique.pyAffiché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.
Relancer le test
python3 -m unittest test_boutique 2>&1 | grep -E "^(OK|FAILED|AssertionError)"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.
Ajouter les voisins du bogue
Une correction peut déplacer un bogue au lieu de le supprimer. Si vous écrivez >= 9999 par erreur, une commande de 99,99 euros reçoit une remise. Testez donc les entrées de chaque côté de celle du signalement.
Exemple travaillé : les cas autour de la limite
| Commande en centimes | Remise attendue | Pourquoi ce cas |
|---|---|---|
| 9999 | 0 | Un centime en dessous : toujours pas de remise |
| 10000 | 1000 | Le signalement : exactement sur la limite |
| 10001 | 1000 | Un centime au-dessus : centimes entiers, arrondi vers le bas |
| 25000 | 2500 | Très au-dessus : pas de plafond sur la remise |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Ajouter deux tests voisins
printf ' def test_un_centime_en_dessous_ne_recoit_rien(self):\n self.assertEqual(remise(9999), 0)\n\n def test_au_dessus_de_la_limite_recoit_un_dixieme(self):\n self.assertEqual(remise(25000), 2500)\n' >> test_boutique.pyAffiché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 les trois
python3 -m unittest test_boutique 2>&1 | grep -E "^(OK|FAILED|AssertionError)"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.
Prouver que le test garde la correction
Un test de régression gagne sa place quand le bogue revient. Remettez le bogue exprès, comme un changement distrait pourrait le faire, et regardez la série de tests l’attraper. Puis remettez la correction.
Remettre le bogue
sed -i 's|total_centimes >= 10000|total_centimes > 10000|' boutique.pyAffiché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 les tests
python3 -m unittest test_boutique 2>&1 | grep -E "^(OK|FAILED|AssertionError)"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.
Remettre la correction
sed -i 's|total_centimes > 10000|total_centimes >= 10000|' boutique.pyAffiché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 les tests une dernière fois
python3 -m unittest test_boutique 2>&1 | grep -E "^(OK|FAILED|AssertionError)"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 corrigent le bogue, écrivent un test qui passe et s’arrêtent là. Ce test n’a jamais été rouge : personne ne sait s’il peut attraper la faute. Écrivez-le d’abord, voyez-le échouer, puis corrigez.
Pour aller plus loin : un signalement sans entrée
Certains signalements n’ont pas d’entrée : « le total était faux mardi ». Avant d’écrire un test, il faut en trouver une.
Listez trois questions à poser au client pour obtenir une entrée que vous pouvez reproduire. Laquelle poseriez-vous en premier ?