2. Spécification et tests

Durant la phase de conception d'un programme, on commence par

  • écrire la spécification du programme (en utilisant des docstrings : chaines de caractères situées en début de programme et juste en dessous des définitions de fonctions, classes,...)

  • écrire des jeux de tests pour valider le fonctionnement du programme.

La spécification décrit les entrées et sorties du programme, ainsi que leurs types.

Les tests vérifient que les sorties du programme sont conformes à ce que l'on attend.

Exemple

Voici une fonction avec sa spécification.

1
def est_pair(n):
2
    """Indique si un nombre est pair ou non
3
4
    Paramètres
5
    ----------
6
    n: int
7
8
    Sorties
9
    -------
10
    bool
11
        True si n est pair, False sinon
12
    """
13
    if n % 2 == 0:
14
        return True
15
    else:
16
        return False

Ou plus succinctement avec les annotations de type:

1
def est_pair(n: int) -> bool:
2
    "Indique si un nombre est pair ou non"
3
    if n % 2 == 0:
4
        return True
5
    else:
6
        return False

Maintenant un ensemble de tests:

1
assert est_pair(2) is True
2
assert est_pair(5) is False
3
assert est_pair(1381635162) is True
4
assert est_pair(-3565454165461) is False
5
# le is True est redondant
6
assert est_pair(4)
7
# le is False peut être écrit
8
assert not est_pair(5)

On peut également ajouter un message en cas d'erreur sur un test en le séparant par une virgule.

1
assert est_pair(2) is True, "Le nombre deux n'a pas été reconnu comme pair"

Ainsi si la fonction présentait un jour une erreur, le programme s'arrêterait en levant l'exception avec le message d'explication.

1
Traceback (most recent call last):
2
  File "<stdin>", line 1, in <module>
3
AssertionError: Le nombre deux n a pas été reconnu comme pair