Rejouer tous les tests à la main, à chaque séance, finit par être…
Exercice supplémentaire · niveau 3 (difficile) · NSI (première), chapitre 11 — Conduire un projet · Versionner, outiller
Énoncé
Rejouer tous les tests à la main, à chaque séance, finit par être négligé. Écrire une fonction lancer(portee) qui exécute automatiquement toutes les fonctions dont le nom commence par test_, affiche le verdict de chacune et le nombre d'échecs.
Corrigé
def lancer(portee):
"""Execute toutes les fonctions dont le nom commence par test_.
portee : le dictionnaire des noms, obtenu par globals().
Renvoie le nombre d'echecs."""
noms = sorted(n for n in portee if n.startswith("test_"))
echecs = 0
for nom in noms:
try:
portee[nom]()
print(" ok ", nom)
except AssertionError as e:
echecs = echecs + 1
print(" ECHEC ", nom, ":", e)
print("%d test(s), %d echec(s)" % (len(noms), echecs))
return echecs
def test_addition():
assert 2 + 2 == 4
def test_qui_echoue():
assert 1 == 2, "un plus un ne fait pas deux"
lancer(dict(globals()))
ok test_addition
ECHEC test_qui_echoue : un plus un ne fait pas deux
2 test(s), 1 echec(s)
Trois points où l'on se trompe en écrivant cette fonction.
- Le
tryest indispensable. Sans lui, le premier test qui échoue interrompt tout, et l'on ne sait rien des suivants. Or ce qui intéresse, c'est précisément combien et lesquels échouent. - On n'attrape que
AssertionError. Une autre exception —IndexError,TypeError— signale un défaut d'une autre nature, et il vaut mieux qu'elle remonte bruyamment plutôt que d'être comptée comme un simple échec de test. dict(globals())et nonglobals(): on parcourt le dictionnaire pendant que la boucle exécute des fonctions susceptibles d'y créer des noms, ce qui provoquerait une erreur « le dictionnaire a changé de taille ». On en passe une copie.
Ce que cette fonction change concrètement : rejouer tous les tests devient une seule commande de trois secondes. La première habitude du cours — « rejouer tous les tests à chaque séance » — cesse de dépendre de la discipline du groupe, et c'est la seule façon fiable de la tenir.
Les autres exercices de ce chapitre Le cours du chapitre
Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.