Skip to content

7. Suite di Test e CI

tatopenn-cell edited this page Jul 22, 2026 · 1 revision

7. Suite di Test e CI

La CI (ci.yml, GitHub Actions, pytest tests/ -v --tb=short, timeout 5 minuti) gira su ogni push/PR a main. Al momento: ~65 test, ~80s totali.

Due livelli di copertura, e perché servono entrambi

Livello 1 — fisica in forma chiusa / cross-validazione. La maggior parte dei file in tests/ (test_analytical.py, test_manufacturing_thermodynamics.py, test_pennylane_comparison.py, test_zne_predictive_healing.py, test_quantum_defect_scanner.py, test_vqe_jax_gradient.py, test_vqe_molecular_optimized.py) verifica la matematica — riscrivendo a mano la stessa formula del circuito e confrontandola con un'identità esatta, una scansione indipendente, o PennyLane. Tolleranze tipiche $10^{-9}$–$10^{-12}$.

Livello 2 — esecuzione reale degli script. tests/test_integration_smoke.py importa ed esegue le funzioni vere di vqe_gradient.py, zne_mitigation.py, scan_ising.py, next_gen_silicon.py (e test_vqe_molecular_optimized.py fa lo stesso con vqe_silicon_molecular.py) — non copie riscritte a mano.

Questo secondo livello è nato da un'osservazione concreta durante l'audit su dense-evolution 8.1.21: entrambi i bug reali trovati (capitoli 3 e 4) vivevano in script che avevano zero copertura diretta — solo test "per proxy" che validavano la stessa fisica a scala ridotta, senza mai eseguire il codice reale dello script. Un test che riscrive la formula a mano non può accorgersi che lo script usa l'API in modo sbagliato, perché non tocca mai quel percorso di codice.

Un dettaglio tecnico: importare script senza effetti collaterali

Gli script di produzione (vqe_gradient.py, zne_mitigation.py, scan_ising.py, next_gen_silicon.py, vqe_silicon_molecular.py) non avevano un guard if __name__ == "__main__": — un semplice import avrebbe eseguito l'intero sweep (fino a 3.500 punti + scrittura CSV/PNG) come effetto collaterale. Tutti e cinque sono stati rifattorizzati per incapsulare la pipeline pesante in una funzione (_run_full_sweep()), lasciando le funzioni fisiche vere e proprie (calcola_energia_vqe, measure_energy_with_shots, ecc.) importabili e chiamabili direttamente. Il comportamento da riga di comando (python vqe_gradient.py) è invariato.

def _run_full_sweep():
    ...  # sweep, CSV, plot

if __name__ == "__main__":
    _run_full_sweep()

Nota sulla RAM in locale

tests/test_vqe_jax_gradient.py usa un SafeMemoryGuard (soglia 15%) che può bloccare l'esecuzione su macchine con poca RAM libera — è l'anti-OOM del motore che funziona come previsto, non un bug del test. Sui runner GitHub Actions (più RAM) non si presenta.


Capitolo 6 · Home

Clone this wiki locally