Aller au contenu principal

Tests unitaires

Un test unitaire est un morceau de code qui vérifie le comportement d'une "unité" de code isolée.

Unité

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 :

  1. Validation fonctionnelle : vérifier que chaque unité fonctionne correctement
  2. Régression : détecter rapidement si une modification casse un comportement existant
  3. Documentation : les tests servent de documentation vivante du comportement attendu
  4. 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.

Mock

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
Patching

Le patching est la technique qui nous permet de remplacer temporairement un objet par un mock.