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.
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.
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()#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é.
En pratique, pytest simplifie l'écriture des tests et les fixtures. La philosophie reste la même: tests petits, lisibles, ciblés.