Python fournit un cadre de test dans sa bibliothèque standard
Exercice supplémentaire · niveau 2 · NSI (première), chapitre 11 — Conduire un projet · Versionner, outiller
Énoncé
Python fournit un cadre de test dans sa bibliothèque standard. Traduire en unittest le jeu de tests de la fonction moyenne vue plus haut, puis dire ce que l'on y gagne et ce que l'on y perd.
Corrigé
import unittest
def moyenne(notes):
"""Moyenne d'une liste non vide. Precondition : len(notes) > 0."""
assert len(notes) > 0, "moyenne d'une liste vide"
return sum(notes) / len(notes)
class TestMoyenne(unittest.TestCase):
def test_nominal(self):
self.assertEqual(moyenne([10, 12, 14]), 12)
def test_un_seul(self):
self.assertEqual(moyenne([7]), 7)
def test_vide(self):
with self.assertRaises(AssertionError):
moyenne([])
unittest.main(verbosity=2, exit=False)
test_nominal (__main__.TestMoyenne.test_nominal) ... ok
test_un_seul (__main__.TestMoyenne.test_un_seul) ... ok
test_vide (__main__.TestMoyenne.test_vide) ... ok
Ran 3 tests in 0.000s
OK
Ce qu'on y gagne.
with self.assertRaises(...)remplace les six lignes du motif « drapeau,try, verdict hors dutry». C'est le gain le plus net : vérifier qu'une fonction refuse devient aussi court que vérifier qu'elle accepte ;- les tests sont découverts, exécutés et comptés sans qu'on écrive de boucle ; chaque échec est isolé, avec son nom et sa ligne ;
- l'outil est dans la bibliothèque standard : rien à installer, et il tournera sur la machine du professeur.
Ce qu'on y perd. Un vocabulaire à apprendre — class, self, assertEqual — dont rien n'est au programme de première, et qui déplace l'attention du contenu des tests vers leur forme. Un élève qui découvre unittest avant d'avoir écrit vingt assert à la main apprend un outil sans avoir rencontré le problème qu'il résout.
L'ordre à respecter : d'abord les assert nus, ensuite le lanceur de l'exercice précédent — qu'on écrit soi-même et qu'on comprend entièrement —, et unittest en dernier, quand le motif « drapeau, try, verdict » est devenu fastidieux. Un outil ne s'apprend bien qu'après le geste qu'il abrège.
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.