Tester son modèle

Un test exécute une partie du modèle avec des entrées connues et compare la sortie à un résultat attendu. Il protège contre une régression silencieuse lorsqu’on modifie une formule, une dépendance ou la préparation des données.

Un test ne juge pas la pertinence financière de sa propre référence. Pour obtenir une vérification utile, choisissez des cas faciles à contrôler et justifiez les résultats attendus indépendamment du code testé.

Organiser les tests

Placez généralement les tests dans un dossier tests/ à la racine du dépôt. Reprenez-y l’organisation du code : un module calculs/marges.py peut correspondre à tests/calculs/test_marges.py. Le préfixe test_ permet à pytest de découvrir les fichiers et fonctions de test.

src/rentabilite/
└── calculs/
    └── marges.py

tests/
└── calculs/
    └── test_marges.py

Les tests n’ont pas besoin de données confidentielles ni de connexion réseau. Préférez des nombres synthétiques pour les calculs et de petits fichiers anonymisés pour les tests d’intégration.

Vérifier une formule avec un petit exemple

Si le chiffre d’affaires vaut 1 000 € et le coût des ventes 620 €, la marge brute est 0,38. Cette référence se vérifie à la main ; elle permet de tester la formule sans dépendre d’un fournisseur de données.

import pytest

def calculer_marge_brute(chiffre_affaires: float, cout_des_ventes: float) -> float:
    if chiffre_affaires == 0:
        raise ValueError("Le chiffre d’affaires ne peut pas être nul.")
    return (chiffre_affaires - cout_des_ventes) / chiffre_affaires

def test_marge_brute_connue():
    resultat = calculer_marge_brute(1000, 620)
    assert resultat == pytest.approx(0.38)

def test_chiffre_affaires_nul_est_refuse():
    with pytest.raises(ValueError, match="ne peut pas être nul"):
        calculer_marge_brute(0, 620)

Ajoutez ensuite un test au cas limite. Dans cet exemple, un chiffre d’affaires nul doit déclencher une erreur explicite : cette convention évite qu’un ratio indéfini soit interprété comme une valeur exploitable.

Vérifier toute la chaîne de traitement

Les tests unitaires isolent une règle comme la marge ou la croissance. Les tests d’intégration vérifient que plusieurs étapes coopèrent : lecture d’un petit fichier d’exemple, conversion des dates, appel du calcul et production d’un tableau. Des contrôles de données vérifient en amont les colonnes requises, les doublons de périodes, les unités et les valeurs impossibles.

from pathlib import Path

import pandas as pd

def test_lecture_du_jeu_exemple():
    chemin = Path("examples/ventes_fictives.csv")
    donnees = pd.read_csv(chemin)

    assert {"periode", "chiffre_affaires", "cout_des_ventes"} <= set(donnees.columns)
    assert donnees["periode"].is_unique

Une fonction pure est souvent plus simple à tester qu’une opération qui lit un fichier, appelle une API, calcule plusieurs mesures et affiche un graphique à la fois.

Comparer à des résultats enregistrés

Pour une fonction qui produit un tableau, des fichiers de référence au format CSV peuvent faciliter la comparaison après une modification. La référence doit être créée à partir de valeurs validées, et non en enregistrant aveuglément la sortie actuelle du programme.

PériodeValeur attendueValeur calculéeDécision
T10,3800,380résultat cohérent
T20,400-0,600examiner la formule ou les entrées

Un test qui échoue indique un écart à comprendre. Il ne faut pas remplacer automatiquement la valeur attendue pour faire repasser le test. Vérifiez d’abord la formule, les périodes, les unités et les modifications récentes.

Un fichier conftest.py peut centraliser des fixtures communes, par exemple la création d’un tableau synthétique ou d’un chemin vers les résultats de référence. Gardez ces outils transparents : les personnes qui lisent le test doivent comprendre comment les valeurs attendues sont obtenues.

Lancer et interpréter les tests

Avec pytest, exécutez les tests depuis la racine du dépôt :

uv run pytest

Un échec utile affiche le test concerné, les entrées et la différence entre résultat attendu et résultat obtenu. Si une valeur passe de 0,38 à -0,62, par exemple, vérifiez qu’une soustraction supplémentaire de 1 n’a pas été introduite dans le calcul de la marge.

Quand un changement voulu modifie les résultats, expliquez-le, vérifiez les nouveaux chiffres par une méthode indépendante, puis seulement mettez à jour les fichiers de référence. Conservez cette justification avec le changement.

Schéma — les entrées et le calcul sont comparés à une référence vérifiée avant d’accepter un changement
les entrées et le calcul sont comparés à une référence vérifiée avant d’accepter un changement

Tests et assistants IA

Demandez un test avec chaque nouvelle fonction, mais contrôlez personnellement les valeurs de référence. Un test qui enregistre seulement ce que la fonction renvoie prouve la répétabilité du résultat, pas sa justesse.

Avant d’accepter une modification produite par un assistant, examinez les changements, lancez les tests pertinents et relisez les chiffres importants. Ne demandez pas à l’assistant de réécrire les références simplement pour supprimer un échec. Il doit expliquer l’écart ; vous décidez si la nouvelle règle est bien celle que le modèle doit appliquer.

Étape suivante

Les tests constituent une partie du cadre de travail d’un assistant de programmation. Le dernier chapitre montre comment préparer le projet et examiner ses propositions : Travailler avec un assistant IA.