0%
Les données de test

Données de test

Constructeur de test, isolation, transactions annulées et jeux de données qui vieillissent mal.

10-15 min

Les données de test

Ce test échoue. Trouvez pourquoi en dix secondes :

@Test
void une_commande_expediee_ne_peut_plus_etre_annulee() {
    Client client = new Client(1L, "Alice", "alice@example.com", "12 rue des Lilas",
                               "75011", "Paris", "FR", true, false, null,
                               LocalDate.of(2024, 1, 1), Statut.ACTIF, 0, null);
    Commande commande = new Commande(10L, client, List.of(
        new Ligne(1L, "REF-1", 2, new BigDecimal("19.99"), new BigDecimal("0.20"))),
        LocalDateTime.now(), StatutCommande.EXPEDIEE, null, null, "FR", false);

    assertThatThrownBy(() -> service.annuler(commande)).isInstanceOf(CommandeExpedieeException.class);
}

Impossible. Le seul détail qui compte — StatutCommande.EXPEDIEE — est noyé au milieu de dix-huit valeurs sans rapport avec l'intention du test. Et le jour où un champ est ajouté au constructeur, les quatre-vingts tests bâtis sur ce modèle cessent de compiler d'un coup.

C'est la dette la plus sournoise d'une suite de tests : elle n'apparaît ni dans la couverture, ni dans la durée d'exécution, mais elle multiplie par trois le coût d'écriture de chaque nouveau test et rend chaque échec illisible. Un bon objet de test rend visible ce qui compte et invisible ce qui ne compte pas. Le reste de cette leçon montre comment, puis traite le second problème des données de test : l'isolation entre tests, où les solutions faciles cachent des compromis qu'il faut connaître.

Commentaires

Les commentaires sont alimentés par GitHub Discussions

Connectez-vous avec GitHub pour participer à la discussion

Lien copié !