Débutant
🧠 Fondamentaux
10 XP
0 personnes ont réussi
Tester les exceptions
Un code qui echoue silencieusement au lieu de lever une erreur, c'est un cauchemar a debugger. Si ta fonction diviser(a, b) retourne 0 au lieu de planter quand b vaut zero, tu vas avoir des resultats faux partout sans jamais savoir pourquoi. Parfois, le bon comportement c'est justement de lever une erreur.
Pour tester qu'une fonction leve bien une exception, on utilise un pattern try/except inverse. Au lieu de tester que le code marche, on teste qu'il plante de la bonne facon :
def test_division_par_zero(): try: diviser(10, 0) # Si on arrive ici, la fonction n'a pas leve d'erreur assert False, "diviser(10, 0) aurait du lever une ValueError" except ValueError: pass # C'est ce qu'on attendait, le test passe
L'idee est la suivante : on appelle la fonction dans un try. Si elle leve l'exception attendue, on la capture avec except et le test passe. Si elle ne leve PAS d'exception, on atteint le assert False qui fait echouer le test.
C'est important de vérifier le TYPE de l'exception. Si tu t'attends a une ValueError mais que la fonction leve un TypeError, c'est un bug aussi.
Écris une fonction tester_diviser(func) qui prend une fonction de division func(a, b) et vérifie :
1. Que func(10, 2) renvoie 5.0 2. Que func(0, 5) renvoie 0.0 3. Que func(10, 0) leve une ValueError 4. Que func(7, 2) renvoie 3.5 5. Que func(-10, 2) renvoie -5.0
Renvoie "OK" si tous les tests passent.
Exemple :
def diviser(a, b): if b == 0: raise ValueError("Division par zero") return a / b
tester_diviser(diviser) renvoie "OK"
Tests (4/5)
Fonction correcte
def bonne_div(a, b):
if b == 0: raise ValueError('div par zero')
return a / b
assert tester_diviser(bonne_div) == 'OK'
Detecte absence de ValueError
def div_sans_check(a, b):
return a / b if b != 0 else 0
try:
tester_diviser(div_sans_check)
assert False, 'Tes tests doivent detecter que la fonction ne leve pas de ValueError'
except (AssertionError, TypeError):
pass
Detecte un mauvais calcul
def div_arrondie(a, b):
if b == 0: raise ValueError('nope')
return int(a / b)
try:
tester_diviser(div_arrondie)
assert False, 'Tes tests doivent detecter que 7/2 donne 3 au lieu de 3.5'
except AssertionError:
pass
Teste la division par zero explicitement
def div_type_error(a, b):
if b == 0: raise TypeError('mauvais type erreur')
return a / b
try:
tester_diviser(div_type_error)
assert False, 'Tes tests doivent vérifier que c est bien une ValueError qui est levee'
except (AssertionError, TypeError):
pass