Terminale NSI • Épreuve pratique • Python

Bien tester son programme avec assert

Une fiche express pour choisir de bons jeux de tests, vérifier les résultats attendus et éviter les erreurs classiques le jour de l’épreuve pratique.

🧪

Tester = prévoir le résultat avant d’exécuter

La méthode à retenir

6 réflexes simples pendant l’épreuve

1️⃣

Lire la spécification

Repère les paramètres, les valeurs autorisées et surtout ce que la fonction doit renvoyer ou modifier.

2️⃣

Prévoir le résultat

Calcule toi-même le résultat attendu avant d’écrire le test. Le test ne doit pas dépendre du programme testé.

3️⃣

Cas classique

Commence par une situation simple, représentative du fonctionnement normal.

4️⃣

Cas limite

Teste si pertinent : liste vide, un seul élément, 0, 1, valeur négative, élément absent… uniquement si l’énoncé les autorise.

5️⃣

Lancer les tests

Avec assert expression, aucune sortie signifie que le test est réussi. Une AssertionError indique un échec.

6️⃣

En cas d’échec

Vérifie d’abord que ton résultat attendu est juste, puis cherche l’erreur dans la fonction.

Les modèles indispensables

À savoir reconnaître et reproduire

Tester une valeur renvoyée

On compare directement le résultat de la fonction avec la valeur que l’on a calculée à l’avance.

Utilise plusieurs valeurs pour vérifier différents cas.

def carre(x):
    return x * x

assert carre(3) == 9    # cas classique
assert carre(0) == 0    # cas particulier : zéro
assert carre(-4) == 16  # valeur négative

Tester un booléen

Si une fonction renvoie True ou False, inutile d’écrire == True ou == False.

assert est_pair(4)      # 4 est pair : True attendu
assert not est_pair(5)  # 5 n'est pas pair : False attendu

Tester une recherche

Teste un élément présent, un élément absent et, si c’est pertinent, une structure très petite.

assert recherche(3, [1,3,5]) == 1   # 3 est à l'indice 1
assert recherche(8, [1,3,5]) == -1  # 8 est absent
assert recherche(4, [4]) == 0        # liste à un seul élément

Fonction qui modifie une liste

Si la fonction modifie une liste sans la renvoyer, on teste la liste après l’appel, pas la valeur renvoyée par la fonction.

L = [3, 1, 2]          # liste avant le tri
tri(L)                  # la fonction modifie directement L
assert L == [1, 2, 3]  # on vérifie l'état final de L

Fonction récursive

Commence par les cas de base, puis vérifie au moins un cas général.

assert factorielle(0) == 1    # cas de base
assert factorielle(1) == 1    # autre cas simple
assert factorielle(5) == 120  # cas général

Dictionnaire

On peut comparer directement le dictionnaire obtenu au dictionnaire attendu.

assert compte(["a","b","a"]) == {
    "a": 2,  # la lettre a apparaît 2 fois
    "b": 1   # la lettre b apparaît 1 fois
}

Les pièges classiques

À éviterBonne pratique
Tester uniquement l’exemple donnéAjouter un cas différent ou limite pertinent.
Inventer un résultat attendu compliquéChoisir des données dont le résultat se calcule facilement à la main.
Tester une valeur interdite par la spécificationRespecter les préconditions de l’énoncé.
Écrire assert tri(L) == ... alors que tri ne renvoie rienAppeler la fonction puis tester l’état de L.
Modifier le programme juste pour faire passer un test fauxRecalculer d’abord le résultat attendu.

⭐ Règle d’or

Un bon test utilise un cas assez simple pour que tu sois certain du résultat attendu sans demander au programme de le calculer.

QCM express : maîtriser assert

20 questions • score sur 20

1. À quoi sert principalement assert ?

2. Quel test vérifie correctement que carre(4) renvoie 16 ?

3. Que se passe-t-il lorsqu’un assert est vrai ?

4. Que signifie une AssertionError ?

5. La fonction est_pair(n) renvoie un booléen. Quel test vérifie que 7 est impair ?

6. Une fonction tri(L) modifie directement la liste et ne renvoie rien. Quel test est adapté ?

7. Pour une fonction récursive, que faut-il tester en priorité ?

8. Quel est le meilleur jeu de tests pour une fonction de recherche ?

9. Avant d’écrire un assert, quelle bonne pratique faut-il appliquer ?

10. Peut-on tester une valeur interdite par les préconditions de l’énoncé ?

11. Quel test est le plus utile pour une fonction qui renvoie le maximum d’une liste non vide ?

12. Pourquoi un test ne doit-il pas recalculer le résultat avec le même algorithme que la fonction ?

13. Pour une fonction qui renvoie l’indice d’un élément ou -1 s’il est absent, quel cas est indispensable ?

14. assert f(x) == f(x) est généralement un mauvais test car…

15. Une fonction doit renvoyer une liste vide pour une entrée valide particulière. Quel test convient ?

16. Si un test échoue après une modification, quelle démarche est la plus rigoureuse ?

17. Pour tester une fonction de tri qui modifie L en place, pourquoi faut-il créer une nouvelle liste pour un second test ?

18. Quelle série teste le mieux une fonction est_pair ?

19. Quel est l’intérêt d’un message dans assert condition, "message" ?

20. Un bon ensemble de tests permet-il de prouver dans tous les cas qu’un programme est correct ?

Checklist avant de rendre

  • ☐ J’ai respecté les préconditions de l’énoncé.
  • ☐ J’ai au moins un cas classique.
  • ☐ J’ai pensé à un cas limite pertinent.
  • ☐ Je connais le résultat attendu de chaque test.
  • ☐ Tous mes assert passent.
  • ☐ J’ai relancé le programme après mes dernières modifications.

← Retour aux ressources NSI