learn.chetana.fr

Isoler des suites E2E sur un tenant partagé

11 min de lectureAvancé

Le bug : deux suites qui se saccagent

Tes suites E2E tournent contre un environnement partagé (une base, souvent un même tenant de test). Chacune crée ses données puis nettoie en fin de run. Le nettoyage naïf : « supprime tout ce qui commence par TEST- ».

Le piège surgit dès qu'une suite préfixe plus finement. Une suite « inbox » crée des TEST-INBOX-…. Une suite « commandes » nettoie avec LIKE 'TEST-%' → elle avale aussi les TEST-INBOX-… de l'autre suite, qui tourne en parallèle. Résultat : des échecs intermittents, non reproductibles en local (où une seule suite tourne), qui n'apparaissent qu'en CI parallèle. Le cauchemar classique.

La cause profonde : TEST-% matche TEST-INBOX-% — un préfixe est un piège à sous-chaînes. Le teardown d'une suite n'a aucune raison de connaître, et encore moins de supprimer, les données d'une autre.

La règle : chaque suite dans son propre espace de noms

Deux principes, appliqués ensemble :

  1. Namespacer les fixtures par run : chaque exécution de suite génère un préfixe unique et non ambigu — pas TEST-, mais E2E-<suite>-<runId>-… (un id de run court, ex. les 8 premiers caractères d'un uuid). Deux runs, même en parallèle, ne peuvent pas se chevaucher.
  2. Scoper le teardown à ce namespace exact : le nettoyage ne supprime que E2E-<suite>-<runId>-%, jamais un préfixe partagé. Une suite ne détruit que ce qu'elle a créé.
❌  DELETE ... WHERE ref LIKE 'TEST-%'          -- avale les données des autres suites
✅  DELETE ... WHERE ref LIKE 'E2E-orders-a1b2c3d4-%'   -- uniquement CE run

Bonus robustesse : si un runId est le seul discriminant, une collision devient quasi impossible ; et un teardown scopé qui plante à mi-course ne fait pas de dégâts collatéraux sur les runs voisins.

Le principe transférable

Sur un état mutable partagé (base, bucket, file), l'isolation des tests ne vient pas de « bien nettoyer » — elle vient de ne jamais empiéter sur le voisin. Un identifiant de run unique + un scope de teardown qui matche cet id exactement, et le parallélisme redevient sûr.

Et méfie-toi des préfixes / LIKE comme frontière d'isolation : startsWith/LIKE 'x%' est une correspondance de sous-chaîne, pas une clé. La vraie frontière est un identifiant complet, pas un préfixe qu'un autre peut étendre.

🧩 Quiz1/3

Pourquoi un teardown `LIKE 'TEST-%'` casse-t-il des suites parallèles ?

🃏 Flashcards1/4