Skip to content

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.