Tests unitaires et assertions en python

Testez une fonction grâce aux assertions.

Nous avons évoqué dans un récent article les exceptions en python. A ce sujet, nous avons vu que l’instruction assert pouvait être utilisée dans un bloc try / AssertionError afin de tester les paramètres d'entrée d’une fonction, par exemple.

Dans cet article nous allons voir une autre utilisation possible de l’instruction assert. Il s’agit ici de tester une fonction.

Mais avant d’aller plus en avant, rappelons rapidement ce que nous entendons par tests unitaires. Comme vous le savez, un programme peut vite devenir complexe et imposant. Fort heureusement, nous avons à notre disposition une arme redoutable qui consiste à décomposer la tâche complexe qu’est le programme en bloc de code spécialisé dans une tâche précise et si possible réutilisable : la fonction.
Le test unitaire, dans le contexte que nous décrivons ici, va consister à vérifier que la fonction retourne bien les valeurs attendues selon les paramètres que nous lui aurons passés en entrée. L’objectif n’est donc pas de passer a une fonction les valeurs de paramètres qu’elle est supposée rencontrer mais bien toutes les valeurs possibles.

Pour y parvenir, nous allons tout simplement stipuler, dans le corps même de notre programme, des assertions, comme ceci :


def liste_impairs(n : int = 0) -> List[int]:

   #initialisation de la liste de sortie
   liste_sortie = []

   #Les  premier nombres impairs sont ajoutés à la liste
   try:
       for i in range(1, 2*n, 2):
           liste_sortie.append(i)
       return liste_sortie
   except TypeError as e:
       return []

Voici tout d’abord une fonction très simple qui va nous retourner les premiers nombres impairs. A la suite de cette fonction, et en dehors, bien-sûr, de celle-ci nous allons dérouler une suite d’assertions comme ceci :


assert liste_impairs(0) == []
assert liste_impairs(2) == [1, 3]
assert liste_impairs() == []
assert liste_impairs(-9) == []
assert liste_impairs('a') == []
assert liste_impairs(3.5) == []

Comme vous le voyez, le principe consiste à spécifier l’appel de la fonction et le résultat attendu. Si l’assertion s'avère fausse, une exception AssertionError sera levée et nous aurons ainsi pu identifier un bug de notre programme, qui, certes ne serait peut-être jamais apparu, mais pourtant bien présent, que ce soit au niveau de la conception ou de la réalisation.