Fiche de révision

Tests

Plutôt que de prouver la justesse d'un programme, on se contente souvent de tester le code en vérifiant qu'il se comporte correctement sur des entrées pour lesquelles le résultat est connu.

ITests unitaires

De l'écriture des spécifications à la validation d'un logiciel, chaque étape du développement est idéalement accompagnée d'une phase de tests. Nous nous intéressons ici aux tests unitaires dont l'objectif est de tester indépendamment chaque fonction.

Ces tests peuvent être conçus avant ou après la fonction à tester, éventuellement par une personne différente. Ils sont généralement exécutés aussi souvent que possible pour éviter les problèmes de régression.

Mot clé

Régression : ajout de bugs lors de modification du code.

Les tests unitaires doivent être les plus couvrants possible, c'est-à-dire envisager le plus de cas possibles (simples ou à problème). Chaque branche du code doit idéalement être testée.

IIOutils de test

Il existe plusieurs outils permettant de réaliser des tests unitaires : les assertions, les doctests, le module tiers pytest

Les exemples suivants concernent une fonction fibo(n) qui calcule le terme n de la suite de Fibonacci (suite définie par F0=0, F1=1 et, pour n>1, Fn=Fn1+Fn2).

1 Assertions

Une assertion échoue si l'expression booléenne qui suit le mot clé assert est fausse. Si elle est vraie, l'exécution continue sans erreur. Une assertion permet donc de vérifier, par exemple, le retour d'une fonction. Dès qu'une assertion est fausse, l'exécution s'arrête (exception AssertionError).

Exemple :

Tableau de 3 lignes, 2 colonnes ;Corps du tableau de 3 lignes ;Ligne 1 : ; assert fibo(0) == 0; Ligne 2 : ; assert fibo(3) == 2; Ligne 3 : ; assert fibo(7) == 13;

2 Module doctest

Le module doctest permet d'intégrer des tests dans la docstring des fonctions. Les doctests sont repérées par la chaîne >>>. Écrire des doctests permet à la fois de réaliser des tests unitaires, mais aussi de documenter efficacement la fonction.

Exemple :

Tableau de 10 lignes, 2 colonnes ;Corps du tableau de 10 lignes ;Ligne 1 : ; # Fichier fibo.py; Ligne 2 : ; def fibo(n: int) -> int:; Ligne 3 : ;     >> fibo(3); Ligne 6 : ;     2; Ligne 7 : ;     >>> fibo(7); Ligne 8 : ;     13; Ligne 9 : ;     """; Ligne 10 : ;     # Texte de la fonction; " src="/modules-assets/images/PB_Bac_06461_NSIT_gene/PB_Bac_06461_NSIT_gene_p009-036_C01_Tab_47.png" />

Les tests peuvent être validés depuis l'interpréteur Python (ici, un des tests a échoué) :

Tableau de 7 lignes, 2 colonnes ;Corps du tableau de 7 lignes ;Ligne 1 : ; >>> import fibo; Ligne 2 : ; >>> import doctest; Ligne 3 : ; >>> doctest.testmod(fibo); Ligne 4 : ; Failed example:; Ligne 5 : ;     fibo(7); Ligne 6 : ; Expected: 13; Ligne 7 : ; Got: 15;

3 Module pytest

pytest permet de faire des tests plus complets (vérification qu'une exception est levée par exemple) et propose des diagnostics plus complets et plus explicites que les autres outils.

On peut démarrer l'utilisation de pytest par l'écriture de fonctions préfixées par test_ contenant chacune une assertion.

Exemple :

Tableau de 12 lignes, 2 colonnes ;Corps du tableau de 12 lignes ;Ligne 1 : ; # Fichier test_fibo.py; Ligne 2 : ; import pytest; Ligne 3 : ; from fibo import fibo; Ligne 4 : ; def test_0():; Ligne 5 : ;     assert fibo(0) == 0; Ligne 6 : ; def test_3():; Ligne 7 : ;     assert fibo(3) == 2; Ligne 8 : ; def test_7():; Ligne 9 : ;     assert fibo(7) == 13; Ligne 10 : ; def test_neg():; Ligne 11 : ;     with pytest.raises(ValueError):; Ligne 12 : ;         fibo(-1);

L'exécution des tests réalisés avec pytest montre un diagnostic plus précis des problèmes (non reproduit ici).

Tableau de 2 lignes, 2 colonnes ;Corps du tableau de 2 lignes ;Ligne 1 : ; >>> import pytest; Ligne 2 : ; >>> pytest.main([

Pour lire la suite

Je m'abonne

Et j'accède à l'ensemble
des contenus du site