Intermédiaire
🧠 Fondamentaux
20 XP
0 personnes ont réussi
Test parametrise
Tu as 20 cas a tester pour une seule fonction, et tu te retrouves a copier-coller le meme assert en changeant juste les valeurs :
assert convertir(0) == 32 # 0 C = 32 F assert convertir(100) == 212 # 100 C = 212 F assert convertir(-40) == -40 # -40 C = -40 F
C'est repetitif. Et si tu as 20 cas a tester, ca devient vite penible. Le test parametrise resout ce problème : tu definis une liste de cas (entrée, sortie attendue) et tu boucles dessus.
for entrée, attendu in cas_de_test: résultat = convertir(entrée) assert résultat == attendu, f"convertir({entrée}) a renvoye {résultat}, attendu {attendu}"
C'est exactement ce que fait le decorateur @pytest.mark.parametrize de pytest, mais en plus simple. L'avantage est que pour ajouter un cas de test, tu ajoutes juste une ligne dans la liste.
Écris une fonction run_parametrized(func, cas_de_test) qui :
1. Prend une fonction func et une liste de tuples (entrée, attendu) 2. Execute func(entrée) pour chaque cas 3. Renvoie un dictionnaire avec : - "passes" : le nombre de tests qui passent - "echecs" : le nombre de tests qui echouent - "details" : une liste de dicts avec "entrée", "attendu", "obtenu", "ok" pour chaque cas
Exemple :
def double(n): return n * 2
cas = [(2, 4), (0, 0), (3, 6), (-1, -2)] r = run_parametrized(double, cas) r vaut {"passes": 4, "echecs": 0, "details": [{"entrée": 2, "attendu": 4, "obtenu": 4, "ok": True}, ...]}
def buggy_double(n): return n + n if n > 0 else 0
cas = [(2, 4), (0, 0), (-1, -2)] r = run_parametrized(buggy_double, cas) r["echecs"] vaut 1 (le cas -1 echoue)
Tests (4/5)
Tous les tests passent
def double(n): return n * 2
cas = [(2, 4), (0, 0), (3, 6), (-1, -2)]
r = run_parametrized(double, cas)
assert r['passes'] == 4 and r['echecs'] == 0
Detecte un echec
def buggy(n): return n * 2 if n > 0 else 0
cas = [(2, 4), (0, 0), (-1, -2)]
r = run_parametrized(buggy, cas)
assert r['echecs'] == 1, f'Il devrait y avoir 1 echec, on en a {r["echecs"]}'