Vérifier à la main, encore et encore
Tu changes une ligne de ton programme. Tu le lances. Tu regardes si le résultat est bon. Tu recommences après chaque changement.
C'est long, et on finit par oublier un cas. Un jour, une vieille fonction ne marche plus, et personne ne s'en aperçoit.
Les programmeurs écrivent donc des tests : de petites vérifications que l'ordinateur refait tout seul.
Mots-clés
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| Test | Une vérification : on appelle la fonction et on compare avec la réponse attendue. | tarif_bus(5) doit rendre 0 |
| assert | Mot de Python qui vérifie qu'une condition est vraie. Sinon, le programme s'arrête. | assert aire(3, 4) == 12 |
| Jeu d'essai | Les valeurs choisies pour tester, avec la réponse attendue pour chacune. | Les âges 5, 11, 12, 25, 26 |
| Cas limite | Une valeur au bord d'une règle, là où le résultat change. | 11 ans et 12 ans |
| Résultat attendu | La réponse qu'on doit obtenir, décidée avant de lancer. | 1 euro |
| Fonction de test | Une fonction dont le nom commence par test_ et qui contient des assert. | def test_enfants(): |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Le mot assert
On écrit assert, puis une condition. Si elle est vraie, il ne se passe rien : le programme continue.
Si elle est fausse, Python s'arrête avec une AssertionError. Ce message veut dire : « Ce que tu croyais vrai est faux. »
Après la condition, une virgule et une phrase donnent le texte du message : assert x == 3, "x doit valoir 3".
À toi : un test qui échoue
def aire(longueur, largeur):
return longueur * largeur
assert aire(3, 4) == 12
print("Premier test réussi")
assert aire(10, 5) == 50
print("Deuxième test réussi")
assert aire(2, 2) == 5
print("Troisième test réussi")
# Lance. Quel print n'apparaît jamais ? Pourquoi ?
# Corrige le nombre attendu du troisième assert.
Quels cas choisir
Un seul test ne prouve pas grand-chose. Il faut des cas différents.
Prends un cas typique, que tout le monde attend. Prends les cas limites, aux bords d'une règle. Prends le cas vide ou zéro.
Les bogues se cachent presque toujours aux bords.
Exemple travaillé : le jeu d'essai de tarif_bus
| Âge | Sorte de cas | Tarif attendu (euros) |
|---|---|---|
| 0 | zéro | 0 |
| 5 | typique | 0 |
| 11 | limite : dernier gratuit | 0 |
| 12 | limite : premier à 1 euro | 1 |
| 25 | limite : dernier à 1 euro | 1 |
| 26 | limite : premier à 2 euros | 2 |
| 60 | typique | 2 |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
À toi : trouver le bogue grâce au message
def tarif_bus(age):
# Moins de 12 ans : gratuit. De 12 à 25 ans : 1 euro. Après : 2 euros.
if age < 12:
return 0
elif age < 25:
return 1
else:
return 2
assert tarif_bus(5) == 0, "5 ans doit être gratuit"
assert tarif_bus(11) == 0, "11 ans doit être gratuit"
assert tarif_bus(12) == 1, "12 ans doit coûter 1 euro"
assert tarif_bus(25) == 1, "25 ans doit coûter 1 euro"
assert tarif_bus(26) == 2, "26 ans doit coûter 2 euros"
print("Tous les tests passent")
# Lance. Le message après la virgule dit quel test a échoué.
# Corrige la fonction, puis relance.
Contrôle rapide
À toi de jouer
Contrôle rapide
3 questionsTes réponses sont corrigées ici et ne sont pas conservées. Un compte garde tes résultats.
Ranger ses tests dans des fonctions
Quand les tests sont nombreux, on les range dans des fonctions. Chaque nom commence par test_.
Une fonction de test vérifie une seule idée. Son nom la décrit : test_enfants, test_adultes.
Si une idée échoue, tu sais tout de suite laquelle. Les tests cachés des tâches de ce cours sont écrits ainsi.