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.

En résumé, un test unitaire est une fonction qui teste une autre fonction. À la place de faire des tests manuellement, on les automatise à l'aide de fonctions à exécuter.

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.

  1. 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.

  2. 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.

  3. 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.py est le fichier dans lequel se trouve les tests unitaires du programme python fonctions_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.

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

  • 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=6 et m=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=6 sur m=2 est bien égal à 3.

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

La vérification
Syntaxe
Exemple

Vérifier que le résultat retourné par la fonction a tester a le bon type.

Vérifier que le résultat est celui attendu.

Vérifications pour les résultats de type liste

La vérification
Exemple

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_init est la longueur initiale de la liste avant l'ajout de l'élément.

  • La variable resultat contient 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

La vérification
Syntaxe
Exemple

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