Plus facile à lire avec un fond crème, une teinte, plus de contraste ou un texte plus grand ? Choisissez vos couleurs et votre texte, une fois pour toutes les pages.

Leçon gratuite

Tests de régression : garder un bogue corrigé

Après cette leçon: Je peux transformer un signalement de bogue en test qui échoue, corriger le bogue et garder le test.

Leçon de 60 min13 commandesLab Linux du quotidien : la trentaine de commandes que les ingénieurs tapent de tête

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

MotCe que ça veut dire
Régressionun bogue qui revient, ou une fonction qui s’arrête après un changement
Test de régressionun test écrit pour un bogue signalé et gardé pour de bon
Signalementce que dit l’utilisateur, avec l’entrée qui a causé le problème
Rougeun lancement où un test échoue
Vertun lancement où tous les tests passent
Cas voisinune 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

Commande
mkdir -p ~/regression

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.

Entrer dans le dossier

Commande
cd ~/regression

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 code de la boutique tel quel

Commande
printf 'def remise(total_centimes):\n    if total_centimes > 10000:\n        return total_centimes // 10\n    return 0\n' > boutique.py

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 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

Commande
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.py

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.

Le lancer et le voir échouer

Commande
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 à

Commande
sed -i 's|total_centimes > 10000|total_centimes >= 10000|' boutique.py

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.

Relancer le test

Commande
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 centimesRemise attenduePourquoi ce cas
99990Un centime en dessous : toujours pas de remise
100001000Le signalement : exactement sur la limite
100011000Un centime au-dessus : centimes entiers, arrondi vers le bas
250002500Trè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

Commande
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.py

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 les trois

Commande
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

Commande
sed -i 's|total_centimes >= 10000|total_centimes > 10000|' boutique.py

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 les tests

Commande
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

Commande
sed -i 's|total_centimes > 10000|total_centimes >= 10000|' boutique.py

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 les tests une dernière fois

Commande
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 ?

À propos de ce labo et de sa source: Lab Linux du quotidien : la trentaine de commandes que les ingénieurs tapent de tête

Vous enseignez à une classe ? Proposez ce module à vos étudiants avec un guide de l'enseignant, des devoirs corrigés et un laboratoire pour chaque étudiant.