[DTP-Worker 20260806_194635] VÉRIF axe NEUF « indépendance à l'ORDRE d'exécution des tests (couplage inter-test par état de classe/module partagé) » → CLEAN 25 suites/651 tests · rev_method + rev_full teeth-prouvés (intra+inter-classe) · 0 édition de prod
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1542,3 +1542,23 @@ gate** (#5, occurrence-zéro).
|
||||
**Résultat.** **25 fichiers de test**, **113 classes** au total. (a) **25/25** fichiers découvrables (`test*.py`). (b) **0** fichier `test*.py` hors `tests/` (aucun test orphelin d'emplacement). (c) **0/113** classe test-porteuse sans `TestCase` dans sa chaîne — **toutes** les classes portant des `test_*` sont réellement collectées. **0 faux-vert de collecte.** Le périmètre exécuté par la CI = le périmètre réellement écrit.
|
||||
|
||||
**Conformité.** 0 édition de production (sweep read-only, harnais en `/tmp`). `./run_ci.sh` inchangé = **33 PASS · 0 FAIL · 0 SKIP**. Fichiers : ce journal + 1 entrée mémoire (`test-discovery-collection-sweep`). Sweep **rejouable** (`ast` + `git ls-files`) — **NON promu en gate** (#5, occurrence-zéro).
|
||||
|
||||
## Session `20260806_194635` — VÉRIF · axe NEUF « indépendance à l'ORDRE d'exécution des tests (couplage inter-test par état de classe/module partagé) » → CLEAN · 0 édition de production
|
||||
|
||||
**Choix de tâche.** `./run_ci.sh` au démarrage = **33 PASS · 0 FAIL · 0 SKIP** (gate complet), arbre propre, roadmap `ROADMAP_8_WEEKS_OR_LESS.md` intégralement livrée/gatée (prod VPS / builds EAS / dépôts ONAPI hors périmètre worker · #8), `OPEN_DECISIONS_REGISTER.md` = arbitrages produit de Michel. Objectif : un **axe teeth encore jamais balayé**.
|
||||
|
||||
**Axe NEUF (absent de la mémoire).** La mémoire couvre déjà, sur les suites : `test-shadowing` (méthodes/classes au nom dupliqué), `test-assertion-reachability` (corps n'atteignant aucune assertion), `test-discovery-collection` (le mécanisme de COLLECTE : nommage `test*.py`, localisation `tests/`, héritage `TestCase`). Jamais éprouvé : l'**indépendance à l'ORDRE d'exécution**. `unittest discover` exécute les méthodes en ordre **alphabétique croissant fixe** (`sortTestMethodsUsing` par défaut). Un test qui **lit** un état laissé par un test **alphabétiquement antérieur** (attribut de classe muté, variable de module, singleton) **passe** dans l'ordre fixe de la CI mais est **couplé** : c'est un faux-vert d'isolation, **invisible à toute la chaîne de gates** (aucun ne varie l'ordre) et distinct des 3 axes sœurs (nom / atteignabilité / collecte). Classe de bug réelle et classique (« order-dependent / flaky tests »).
|
||||
|
||||
**Détecteurs (stdlib pur `unittest`, rejouables, harnais `/tmp` — 0 fichier prod touché).** Pour chacun des **25** dossiers-module (cwd = dir module, `sys.path` répliquant `python3 -m unittest discover -s tests`), 3 exécutions comparées :
|
||||
- **normal** : ordre CI (référence).
|
||||
- **rev_method** : `sortTestMethodsUsing` **inversé** → renverse l'ordre des méthodes **intra-classe** (couplage inter-méthode d'une même classe).
|
||||
- **rev_full** : inversion des méthodes **+** renversement récursif de l'arbre `TestSuite` (`_tests[::-1]`) → renverse aussi l'ordre des **classes** (couplage **inter-classe** : classe A alpha-première produit un état lu par classe Z). Purge des modules fraîchement importés entre chaque dir pour un ré-import propre.
|
||||
Critère : `run/f/e` identiques aux 3 modes **et** 0 failure/error partout.
|
||||
|
||||
**Dents prouvées (mutants synthétiques, prod intouchée).** 3 discriminations end-to-end :
|
||||
- Intra-classe : `test_a_sets` remplit `TestCoupled.state`, `test_z_reads` l'assert → **normal (4,0,0)** cache, **rev_method (4,1,0)** MORD. Suite propre voisine épargnée.
|
||||
- Inter-classe : `SHARED` de module rempli par `TestA_Producer`, lu par `TestZ_Consumer` → **normal (2,0,0)** cache, **rev_method (2,0,0)** MISS (méthodes seules ne renversent pas l'ordre des classes), **rev_full (2,1,0)** MORD. Prouve que rev_full apporte une puissance de détection réelle au-delà de rev_method — les **deux** axes étaient nécessaires.
|
||||
|
||||
**Résultat.** Sur **25 suites · 651 tests** : **0 module order-dependent** sous rev_method **et** sous rev_full. `run/failures/errors` strictement identiques aux 3 ordres, 0 failure partout. **Aucun couplage inter-test caché** (ni intra-classe ni inter-classe) : le vert de la CI ne dépend pas de son ordre alphabétique fixe. Chaque test est réellement isolé.
|
||||
|
||||
**Conformité.** 0 édition de production (sweep read-only, harnais `/tmp`). `./run_ci.sh` inchangé = **33 PASS · 0 FAIL · 0 SKIP**, arbre propre. Fichiers : ce journal + 1 entrée mémoire (`test-order-independence-sweep`). Sweep **rejouable** (`unittest` stdlib pur) — **NON promu en gate** (#5, occurrence-zéro).
|
||||
|
||||
Reference in New Issue
Block a user