Une erreur qui coûte cher
Un vendredi soir, une boutique en ligne change le calcul de la TVA. Personne ne vérifie.
Tout le week-end, les clients paient le prix hors taxe. L'entreprise perd 3 000 €.
Un test de quatre lignes aurait trouvé l'erreur avant la mise en ligne.
À la fin de cette leçon
Remarque
Je peux écrire un test qui vérifie une fonction.
Mots clés
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| Test | du code qui vérifie un autre code | |
| assert | une ligne qui arrête tout si la condition est fausse | assert obtenu == attendu |
| Valeur attendue | le résultat que vous calculez à la main | |
| Valeur obtenue | le résultat que la fonction renvoie | |
| Cas limite | une valeur pile à la frontière d'une règle | 5000 |
| pytest | un outil Python qui lance tous les tests |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Un test compare attendu et obtenu
Un test pose une question simple : la fonction donne-t-elle le bon résultat ?
Vous calculez d'abord la valeur attendue à la main. 10 € hors taxe font 12 € TTC.
Puis vous appelez la fonction pour avoir la valeur obtenue. assert obtenu == attendu ne dit rien si les deux sont égales. Sinon, le programme s'arrête avec une AssertionError.
Essayez : un premier test
def prix_ttc(prix_ht):
# TVA à 20 %, prix en centimes
return prix_ht + prix_ht * 20 // 100
attendu = 1200
obtenu = prix_ttc(1000)
assert obtenu == attendu, "le prix TTC est faux"
print("Test réussi : 1000 HT donne", obtenu, "TTC")
# À vous : ajoutez un assert pour un prix HT de 2500 centimes.
# Calculez d'abord à la main le prix TTC que vous attendez.
Un test vérifie une seule idée
En entreprise, chaque test est une fonction dont le nom commence par test_. L'outil pytest les trouve et les lance tous.
Un test vérifie une seule idée. Son nom dit laquelle, comme test_prix_nul.
Quand un test échoue, son nom vous dit tout de suite ce qui ne va plus.
Exemple : trois tests pour prix_ttc
| Nom du test | Prix HT | Attendu TTC | Pourquoi ce cas |
|---|---|---|---|
| test_prix_courant | 1000 | 1200 | Un prix normal |
| test_prix_nul | 0 | 0 | Un article offert |
| test_petit_prix | 5 | 6 | Un arrondi sur un petit prix |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Essayez : des tests nommés
def prix_ttc(prix_ht):
return prix_ht + prix_ht * 20 // 100
# Un test par idée, avec un nom qui dit ce qu'il vérifie.
def test_prix_courant():
assert prix_ttc(1000) == 1200
def test_prix_nul():
assert prix_ttc(0) == 0
def test_petit_prix():
assert prix_ttc(5) == 6
# pytest lance ces fonctions tout seul. Ici, on les appelle à la main.
test_prix_courant()
test_prix_nul()
test_petit_prix()
print("Les trois tests passent.")
Les bugs se cachent aux frontières
Une règle a souvent une frontière : « livraison offerte dès 50 € ». Les erreurs se cachent pile sur cette frontière, à 50 € tout rond.
Testez donc trois valeurs : une en dessous, une au-dessus, et une pile sur la limite. Pensez aussi à zéro et aux listes vides.
Une erreur fréquente
Attention
Beaucoup pensent qu'un test qui passe prouve que le code est juste. C'est faux. Un test ne vérifie que les cas que vous avez écrits. Ajoutez les cas limites, sinon le bug passe à côté.
À vous : le bug à 50 €
def frais_de_port(total):
# Livraison offerte dès 50 €, sinon 4,90 € (en centimes)
if total > 5000:
return 0
return 490
def test_petite_commande():
assert frais_de_port(2000) == 490
def test_grosse_commande():
assert frais_de_port(8000) == 0
def test_pile_cinquante_euros():
assert frais_de_port(5000) == 0
test_petite_commande()
test_grosse_commande()
test_pile_cinquante_euros()
print("Tout passe.")
# Exécutez : un test échoue. Corrigez la fonction, pas le test.