Tests unitaires
Qu'est-ce qu'un test unitaire ?
Les tests unitaires sont des tests automatisés permettant d'assurer le bon fonctionnent de parties spécifiques d'un programme (des fonctions) de manière isolée.
Les tests unitaires peuvent être exécutés automatiquement chaque fois que des modifications sont apportées au code. Cela garantit une validation rapide après chaque modification.
Qu'est-ce qu'on veut vérifier dans un test unitaire?
Dans ce cours, le minimum à vérifier serait les points suivants :
Vérifier la valeur et le type de retour d’une fonction.
Vérifier le contenu d’une liste (valeur, type, nombre d'éléments).
Vérifier les cas limites (ex. dépassement de capacité, division par zéro, etc.).
D'autres vérifications existent pour assurer le fonctionnement parfait d'une fonction. Vous aurez l'occasion de les découvrir au fil des exercices (si l'occasion se présente) et dans vos prochains cours de programmation.
Structure d'une fonction de test unitaire : AAA
La méthodologie utilisée pour structurer un test unitaire est AAA pour "Arrange", "Act", et "Assert". Elle est souvent utilisée pour structurer les tests unitaires.
Arrange (Préparer) :
Mettre en place toutes les conditions préalables nécessaires pour exécuter le test.
Préparation et l'initialisation des données.
Configuration de l'environnement.
Instanciation d'objets.
etc.
Act (Agir) :
Exécuter l'action ou le comportement que vous souhaitez tester.
Appel de la fonction à tester,
manipulation d'objets,
ou toute autre opération qu'on veut évaluer.
Assert (Vérifier) :
Vérifier que le résultat de l'action effectuée dans la phase "Act" est conforme aux attentes.
Si le résultat est celui attendu, le test passe ; sinon, le test échoue.
Méthode de test
Les tests unitaires se font à l'aide de modules intégrés ou tiers. Le module que nous allons utiliser est pytest.
Tests unitaires avec pytest
Voir les étapes décrites ici pour installer le module pytest.
Un fichier de test est un fichier python (.py) dont le nom est préfixé par test_ suivi du nom du fichier python à tester. Exemple :
test_fonctions_a_tester.pyest le fichier dans lequel se trouve les tests unitaires du programme pythonfonctions_a_tester.py.Le nom de la fonction de test unitaire doit être préfixée par test_. Par soucis de clarté, on fait suivre le préfixe test_ par le nom de la fonction à tester (ou un nom similaire indiquant le test précis).
Afin d'utiliser certaines fonctionnalités (décorateurs) de pytest, on doit importer pytest:
import pytest.
Le nom de la fonction doit obligatoirement commencer par le mot clé test_. pour qu'elle soit reconnue comme étant un test unitaire.
Bonne pratique :
On créé un projet de test pour chaque projet python à tester.
Dans un projet de test, on créé un fichier de test par fichier .py du projet à tester.
Les exemples qui vont suivre sont basés sur la structure suivante contenant le code pour les tests unitaires :

fonction_a_tester.py est le fichier du programme dans lequel se trouve les fonctions à tester.
test_fonction_a_tester.py est le fichier dans lequel se trouve les fonction de test du fichier fonction_a_tester.py.
Syntaxe des vérifications assert
assert condition : la condition qui exprime le résultat attendu est évaluée. Si le résultat est vrai, le test passe ; sinon, le test échoue.
Le message d'erreur est optionnel.
Exemples
Exemple d'un test unitaire
Fonction à tester :
Exemple d'un test unitaire de base pour la fonction précédente :
Voir la structure AAA pour plus de détails sur # Arrange # Act et # Assert.
Arrange : on définit les données de test
n=6etm=2.Act : on appelle la fonction
division_entiere_1(qu'on veut tester).Assert : on vérifie si le résultat de la division de
n=6surm=2est bien égal à 3.
Isolation : une unité spécifique de code doit être testée seule pour s'assurer qu'elle fonctionne indépendamment des autres parties du programme.
On teste une seule fonction à la fois (une fonction de test teste une seule fonction). Il peut y avoir plusieurs fonctions de test pour une seule fonction à tester.
On n'appelle pas d'autres fonctions qui ont besoin d'être testées (autre que celle qu'on veut tester).
Précision :
Les tests unitaires doivent couvrir divers scénarios de données et vérifier que l'unité testée produit les résultats attendus dans toutes les situations.
Pour une fonction à tester, on regroupe les tests du même type dans la même fonction de test.
Les données de test
Avant d'écrire un test unitaire, on doit préparer un plan de tests contenant les données à tester. Ce données sont mentionnées au dessus d'un test unitaire :
Syntaxe :
Exemple :
Vérifications (Assert) minimales à faire (selon le type du résultat retourné)
Vérifications pour les types simples
Vérifications pour les résultats de type liste
Vérifier que le résultat est bien de type list
Vérifier que la longueur de la liste est celle attendue
Pour vérifier l'ajout d'un élément dans une liste.
La variable
longueur_initest la longueur initiale de la liste avant l'ajout de l'élément.La variable
resultatcontient la liste retournée par l'appel à la fonction.
Vérifier que chaque élément de la liste a le bon type.
À l'ajout d'un élément à une liste : vérifier que l'élément ajouté est bien à la bonne place.
À la suppression d'un élément dans une liste : L'élément supprimé n'existe plus dans la liste (not in).
À la modification d'un élément dans une liste : - la modification de l'élément a bien été faite correctement. - L'ancien élément avant la modification n'existe plus dans la liste.
Vérifications pour les exceptions
Vérifier qu'une exception est gérée
Exemples
Exercices guidés
Pour chaque fonction :
Faites le plan de test : les données d'entrée, le résultat attendu
Listez les vérifications (assert) à faire.
Créez votre teste unitaire sur la base des deux points précédents.
Fonction 1 : generer_adresses_courriel
Test unitaire de la fonction generer_adresses_courriel
Fonction 2 : ajouter_tache
[...cet exemple n'est pas très pertinent car la méthode .insert(...) sur les listes est écrite correctement et fait déjà des vérifications mais l'idée est de réfléchir à ce qu'il faudrait vérifier dans un test unitaire...]
Tests unitaires de la fonction ajouter_tache
Last updated