Tester une règle métier isolément
Objectif : Vérifier le calcul du total des dépenses avec des tests unitaires ciblés.
Un total erroné peut fausser le résumé affiché par l’outil de dépenses, même si le reste de l’application semble fonctionner. Vous allez vérifier cette règle métier sans lancer l’interface ni dépendre d’une collecte de données. Un test unitaire ciblé vous permettra de détecter rapidement une régression.
Isoler le calcul métier
Le service contient les règles métier. Pour tester un calcul de total, fournissez-lui directement une collection de dépenses et vérifiez le résultat, sans appeler la collecte asynchrone ni l’interface en ligne de commande. Cette séparation réduit le nombre de causes possibles lorsqu’un test échoue. Les contrats de types et la configuration mypy ont été présentés dans les leçons précédentes ; ici, concentrez-vous sur le comportement à vérifier.
Écrire un test Arrange-Act-Assert
Un test lisible sépare trois étapes : préparez les données nécessaires (Arrange), appelez la fonction testée (Act), puis comparez le résultat au résultat attendu (Assert). Créez ou complétez tests/test_service.py. Dans cet exemple, la fonction publique du service s’appelle calculer_total et renvoie un montant Decimal.
from decimal import Decimal
from depenses.modeles import Depense
from depenses.service import calculer_total
def test_calculer_total_additionne_les_montants() -> None:
# Arrange
depenses = [
Depense(description="Repas", montant=Decimal("12.50")),
Depense(description="Transport", montant=Decimal("3.20")),
]
# Act
total = calculer_total(depenses)
# Assert
assert total == Decimal("15.70")L’assertion compare directement le résultat à une valeur attendue, sans arrondir ni transformer le résultat pour faire réussir le test. Si calculer_total additionne les deux montants, pytest affiche que le test a réussi. Si la fonction renvoie, par exemple, Decimal("15.69"), pytest signale les valeurs comparées et l’emplacement de l’échec.
python -m pytest tests/test_service.py -q. [100%]
1 passedInterpréter et maintenir le test
Un test unitaire vérifie ici une fonction métier en lui passant des données en mémoire. Il ne teste ni le stockage, ni une réponse réseau, ni le rendu de la page. Cette isolation rend le résultat plus rapide et plus précis : un échec met en cause le calcul ou les données préparées, plutôt qu’une dépendance extérieure.
L’exemple porte sur un calcul de total avec deux dépenses. Il ne couvre pas encore plusieurs entrées, les montants invalides ou les situations limites : ces vérifications seront traitées dans la leçon consacrée aux cas d’entrée. Lorsque vous ajoutez un test, nommez-le selon le comportement attendu afin que le rapport pytest soit compréhensible sans ouvrir immédiatement son contenu.
À retenir
- Préparez des données explicites, appelez la fonction métier, puis vérifiez son résultat : Arrange-Act-Assert.
- Utilisez une assertion pytest directe qui compare le résultat à une valeur attendue.
- Testez le calcul sans dépendances externes pour localiser plus facilement les régressions.
- Exécutez le test ciblé avec python -m pytest tests/test_service.py -q.