Aller au contenu principal

Tests unitaires

Progression

#Tests unitaires

Les tests unitaires constituent une pratique essentielle du développement logiciel moderne. Ils permettent de prévenir les régressions lors de modifications du code, de documenter le comportement attendu des fonctions, et de refactorer en toute confiance. Un bon test vérifie un comportement spécifique à travers des assertions simples, couvre les cas nominaux et les cas limites, et isole soigneusement les effets de bord pour garantir sa reproductibilité.

#Approche simple: assertions

La forme la plus simple de test consiste à utiliser l'instruction assert pour vérifier qu'une condition est vraie. Cette approche minimaliste convient aux vérifications rapides et aux scripts d'exploration, bien que les frameworks de tests offrent des fonctionnalités plus riches pour les projets de production.

pythonpython
1def add(a, b):2    return a + b3 4assert add(2, 3) == 5

#unittest (stdlib)

Le module unittest de la bibliothèque standard Python fournit un framework complet pour organiser et exécuter des tests. Les tests s'organisent en classes héritant de unittest.TestCase, et chaque méthode de test commence par le préfixe test_. Ce framework offre de nombreuses méthodes d'assertion (assertEqual, assertTrue, assertRaises, etc.) et des mécanismes de setUp/tearDown pour gérer le contexte des tests.

pythonpython
1import unittest2 3def fact(n: int) -> int:4    return 1 if n <= 1 else n * fact(n-1)5 6class TestFact(unittest.TestCase):7    def test_base(self):8        self.assertEqual(fact(1), 1)9        self.assertEqual(fact(5), 120)10 11if __name__ == '__main__':12    unittest.main()
Chargement de l’éditeur...

#Bonnes pratiques

Un bon test unitaire couvre à la fois les cas nominaux (comportement standard) et les cas limites (valeurs nulles, vides, extrêmes ou invalides). Les tests doivent être déterministes, indépendants les uns des autres et rapides à exécuter. Évitez les dépendances d'ordre entre tests qui rendent la suite fragile. Nommez vos tests clairement selon le comportement testé, par exemple test_division_par_zero_leve_exception. Pour isoler les interactions avec le système de fichiers, les bases de données ou le réseau, utilisez des doubles de test (mocks, stubs) et des fixtures qui fournissent un environnement contrôlé.

pytest

En pratique, pytest simplifie l'écriture des tests et les fixtures. La philosophie reste la même: tests petits, lisibles, ciblés.

Quel trait rend un test unitaire efficace ?
Quel trait rend un test unitaire efficace ?