Tests unitaires
Un test unitaire est un morceau de code qui vérifie le comportement d'une "unité" de code isolée.
Une unité représente la plus petite partie testable d'une application, généralement une fonction ou une méthode.
Objectifs des tests unitaires
Les tests unitaires servent plusieurs objectifs cruciaux :
- Validation fonctionnelle : vérifier que chaque unité fonctionne correctement
- Régression : détecter rapidement si une modification casse un comportement existant
- Documentation : les tests servent de documentation vivante du comportement attendu
- Design : l'écriture de tests pousse à un meilleur design du code
Structure d'un test unitaire : AAA
Pattern
Chaque test unitaire suit le pattern AAA : Arrange - Act - Assert :
Arrange (Préparation)
- Mise en place des données de test
- Initialisation des objets nécessaires
- Configuration de l'environnement
Act (Action)
- Éxecution du code à tester
- Appel de la méthode/fonction cible
Assert (Vérification)
- Validation des résultats
- Vérification des effets de bord attendus
- Contrôle des exceptions si nécessaire
Exemple
def test_successful_return(self):
"""Test le retour réussi d'un livre."""
# Arrange
self.book.borrow()
# Act
result.self.book.return_book()
# Assert
self.assertTrue(result)
self.assertTrue(self.book.is_available)
Bonnes pratiques
Pour assurer une bonne couverture, il faut :
- Tester les cas normaux
- Tester les cas d'erreur
- Tester les cas limites
Pour assurer une bonne maintenance, il faut :
- Écrire des tests simples et lisibles
- Éviter la duplication du code
- Écrire des commentaires explicant les cas complexes
Le mocking et le patching
Dans une application réelle, notre code interagit souvent avec des systèmes externes :
- Bases de données
- Services Web
- Système de fichiers
- Services d'email
- APIs externes
Le mocking est une technique qui permet de simuler ces dépendances externes dans nos tests.
Un mock est un objet qui simule le comportement d'un objet réel.
En programmation, les mocks nous permettent de :
- Contrôler le comportement des dépendances
- Vérifier comment notre code interagit avec ces dépendances
- Simuler différents scénarios, y compris les cas d'erreur
Le patching est la technique qui nous permet de remplacer temporairement un objet par un mock.