Les tests unitaires en Python
1. Pourquoi tester son code ?
Quand on écrit un programme, il peut contenir des erreurs (bugs). Pour s’assurer que les fonctions produisent le bon résultat, on peut écrire des tests.
Un test unitaire permet de vérifier qu'une fonction donne le bon résultat pour une entrée donnée.
✅ Avantage : cela permet de repérer rapidement les erreurs et de vérifier que tout fonctionne après une modification du code.
2. Tester manuellement une fonction
Imaginons une fonction qui calcule le carré d’un nombre :
def carre(x):
return x * x
print(carre(2)) # Devrait afficher 4
print(carre(-3)) # Devrait afficher 9
👉 Ici, on teste manuellement la fonction, mais ce n’est pas idéal si on a beaucoup de cas à tester.
3. Utiliser assert
pour automatiser les tests
Python propose une instruction appelée assert
(affirmer que) :
assert carre(2) == 4
assert carre(-3) == 9
➡️ Si l’égalité est vraie, Python continue.
➡️ Si elle est fausse, une erreur est levée et le programme s’arrête.
assert carre(3) == 10 # Erreur : 9 != 10
4. Créer une fonction de test
On peut créer une fonction spéciale pour tester d’autres fonctions :
def test_carre():
assert carre(0) == 0
assert carre(5) == 25
assert carre(-2) == 4
print("Tous les tests passent !")
test_carre()
5. Les erreurs les plus courantes
- Ne pas couvrir tous les cas possibles (positif, zéro, négatif…)
- Comparer des types différents (ex. :
float
etint
) - Confondre valeur attendue et valeur retournée
6. Tests unitaires avec unittest
(optionnel/bonus)
Python propose un module spécial pour les tests : unittest
.
import unittest
def carre(x):
return x * x
class TestFonctions(unittest.TestCase):
def test_carre(self):
self.assertEqual(carre(3), 9)
self.assertEqual(carre(0), 0)
self.assertEqual(carre(-2), 4)
unittest.main()
✅ Utile pour des projets plus gros, mais le mot-clé assert
suffit souvent au lycée.
🧠 À retenir
- Les tests unitaires servent à vérifier le bon fonctionnement d’une fonction.
- Le mot-clé
assert
permet de détecter automatiquement si une valeur est incorrecte. - Les tests doivent couvrir plusieurs cas : valeurs normales, limites, erreurs.
Exercices
Exercice 1 – Tester une fonction factorielle
Voici une fonction factorielle
à compléter :
def factorielle(n):
if n == 0:
return 1
else:
return n * factorielle(n - 1)
- Écrivez une fonction
test_factorielle()
avec plusieursassert
:
factorielle(0)
doit renvoyer1
factorielle(3)
doit renvoyer6
factorielle(5)
doit renvoyer120
Exercice 2 – Trouver l'erreur
Voici une fonction somme_pairs
censée additionner les nombres pairs d'une liste :
def somme_pairs(liste):
total = 0
for x in liste:
if x % 2 == 1:
total += x
return total
- Testez cette fonction avec :
assert somme_pairs([1, 2, 3, 4]) == 6
- Corrigez la fonction pour qu’elle fonctionne comme prévu.
Exercice 3 – Tester une fonction est_palindrome
Écrivez une fonction est_palindrome(mot)
qui renvoie True
si un mot est un palindrome (ex. "radar", "bob").
- Écrivez la fonction.
- Écrivez les tests unitaires suivants :
assert est_palindrome("radar") == True
assert est_palindrome("python") == False
assert est_palindrome("kayak") == True
Exercice 4 – Une erreur silencieuse
def divise(a, b):
return a // b
- Écrivez un test qui vérifie que
divise(10, 2)
donne5
. - Que se passe-t-il si vous testez
divise(10, 0)
? - Ajoutez un test qui provoque une erreur attendue, et ajoutez une condition de sécurité dans la fonction.