Stratégie de tests — CVN-N014-ED-S02 (s43 cross-pod transport)¶
Réfs : plan · architecture · runbook. Taxonomie : ADR-83.
1. Objectifs & périmètre¶
Tester : (a) le round-trip de sérialisation (dtype float64 + ordre + run_ids) via S3 ; (b) le contrat .npz fail-loud (schéma inconnu / array manquant / shape incompatible → raise) ; (c) la sémantique absent → None (toléré) vs présent-corrompu → raise ; (d) la run-isolation du préfixe ; (e) le transport cross-pod réel (le gate d'acceptation).
Ne PAS confondre : un test tmp_path ou mono-pod ne peut pas être le gate (il est vert sur un chemin cross-pod cassé — H4 du plan). C'est précisément le piège que la Story tue.
2. Pyramide + tiers ADR-83¶
| Niveau | Marqueur | Tier | Ce qui est testé | Fichier |
|---|---|---|---|---|
| Round-trip + contrat (pur) | unit |
fast (PR-blocking) | persist/load via FakeS3Store (dict partagé = modélise le cross-pod) ; schéma fail-loud ×3 ; absent→None ; run-isolation |
tests/unit/test_s43_io_predictions.py (9 verts) |
| Acceptation cross-pod | smoke | system | 5 pods K8s distincts persist → gate (autre pod) load via clés attendues → cohort_count == 5 |
DAG diagnostic__s43 sur cluster (post-merge) |
Tous portent @pytest.mark.story("CVN-N014-ED-S02") (ADR-87).
3. Cas de tests unitaires (le contrat)¶
| # | Entrée | Attendu |
|---|---|---|
| T1 | persist puis load (2 draws distincts) | round-trip exact, ordre + float64 + run_ids préservés ; clé = <prefix>/<leaf> |
| T2 | même config ×2 (run_ids distincts) | 2 lignes conservées (poids empirique) |
| T3 | K=0 (pbuys vide) | aucune clé écrite ; load → None (absent, pas present-but-empty) |
| T4 | load d'un blob absent | None |
| T5 | cohorte avec 1 crypto manquant | absent du per_family (complétude le flagge) |
| T6 | blob présent, schema_version=999 |
raise ValueError schema mismatch |
| T7 | blob présent sans P |
raise missing array 'P' |
| T8 | blob présent, P/y_va shape ≠ |
raise shape mismatch |
| T9 | 2 préfixes (run-A / run-B) | run-B ne voit pas les blobs de run-A |
4. Le gate d'acceptation (système — post-merge)¶
Le seul test qui prouve le load-bearing : un run réel de diagnostic__s43 sur le cluster, 5 pods distincts (prouvés par pod_name/hostname distincts dans les logs) persistant vers S3 → le pod gate charge la cohorte → cohort_count == 5 (aujourd'hui, avec le bug /tmp : 0). C'est ce qui fait passer la Story à Tested (DoD §2) — impossible en unitaire, impossible avant le merge (le DAG ne se déploie que via main).
5. Hors-scope test¶
- Science s43 (keying métier, K_eff, cohorte) → CVN-N001-EI-S05.
- Généralisation de la couche pass-by-ref → S03.