Sono un grande sostenitore dello sviluppo guidato dai test nell'informatica scientifica. La sua utilità in pratica è semplicemente sbalorditiva e allevia davvero i classici problemi che gli sviluppatori di codice conoscono. Tuttavia, ci sono difficoltà intrinseche nel testare codici scientifici che non si incontrano nella programmazione generale, quindi i testi TDD non sono estremamente utili come tutorial. Per esempio:
In generale non conosci una risposta esatta per un dato problema complesso a priori, quindi come puoi scrivere un test?
Il grado di parallelismo cambia; Di recente ho riscontrato un bug in cui l'utilizzo delle attività MPI come multiplo di 3 falliva, ma un multiplo di 2 ha funzionato. Inoltre, i framework di test comuni non sembrano molto compatibili con MPI a causa della natura stessa di MPI: è necessario rieseguire un binario di test per modificare il numero di attività.
I codici scientifici hanno spesso molte parti strettamente accoppiate, interdipendenti e intercambiabili. Abbiamo visto tutti il codice legacy e sappiamo quanto sia allettante rinunciare a un buon design e utilizzare variabili globali.
Spesso un metodo numerico può essere un "esperimento", o il programmatore non capisce completamente come funziona e sta cercando di capirlo, quindi anticipare i risultati è impossibile.
Alcuni esempi di test che scrivo per codice scientifico:
Per gli integratori di tempo, utilizzare un semplice ODE con una soluzione esatta e verificare che l'integratore lo risolva entro una determinata precisione e l'ordine di accuratezza sia corretto eseguendo test con passi di dimensioni variabili.
Test di stabilità zero: verificare che un metodo con 0 limiti / condizioni iniziali rimanga a 0.
Test di interpolazione: data una funzione lineare, assicurarsi che un'interpolazione sia corretta.
Convalida legacy: isolare un blocco di codice in un'applicazione legacy che è nota per essere corretta ed estrarre alcuni valori discreti da utilizzare per i test.
Spesso viene fuori che non riesco a capire come testare correttamente un determinato blocco di codice, a parte tentativi ed errori manuali. Potete fornire alcuni esempi di test scritti per codice numerico e / o strategie generali per testare software scientifici?