Ho scoperto che gran parte della mia programmazione scientifica computazionale ha requisiti di test che non sono coperti da framework di test standard:
Test dei tempi di calcolo
- Per assicurarsi che gli algoritmi non rallentino. Potrei fare qualcosa del genere
assureSmallerEqual(RuntimeWrapper(algorithm),53)
ma vorrei che la soglia dei 53 secondi venisse ridotta continuamente mentre sto lavorando all'algoritmo, cioè qualcosa del genereassureSmallerEqual(RuntimeWrapper(algorithm),'previousbest+noisetolerance')
- Per assicurarsi che gli algoritmi non rallentino. Potrei fare qualcosa del genere
Test delle prestazioni
- Per assicurarsi che un algoritmo che abbia precedentemente trovato una buona approssimazione a una soluzione analitica trovi ancora una soluzione che sia almeno altrettanto buona o migliore. Ancora una volta, questo potrebbe essere emulato da un test di integrazione standard, ma vorrei che la tolleranza diminuisse continuamente mentre l'algoritmo migliora sempre meglio. Pensa a sostituire
assureAlmostEqual(foo(),1,places=3)
conassureAlmostEqual(foo(),1,places='previousbest')
- Per assicurarsi che un algoritmo che abbia precedentemente trovato una buona approssimazione a una soluzione analitica trovi ancora una soluzione che sia almeno altrettanto buona o migliore. Ancora una volta, questo potrebbe essere emulato da un test di integrazione standard, ma vorrei che la tolleranza diminuisse continuamente mentre l'algoritmo migliora sempre meglio. Pensa a sostituire
Test dei requisiti fisici
- Per assicurarsi che gli algoritmi non abbiano improvvisamente bisogno di più memoria / spazio sul disco rigido. Molto simile a 1.
Test dei requisiti astratti
- Per assicurarsi che un algoritmo che ha funzionato bene con approssimazioni quadratiche non abbia improvvisamente bisogno di approssimazioni cubiche o che un algoritmo che ha funzionato bene con il passo 0.1 non abbia improvvisamente bisogno di 0,01 per stabilità. Ancora una volta, questi potrebbero essere emulati da test di integrazione standard, ma l'obiettivo è ricordare quale sia il parametro di requisito più piccolo che ha raggiunto un determinato obiettivo, quindi ciò richiederebbe un sacco di aggiornamento manuale. Ad esempio, se in
foo(10)
precedenza non avesse fatto eccezioni, mi piacerebbe che il framework assicurasse che funzionifoo(10)
ancora e provare anche sefoo(9)
ora funziona (nel qual caso tutti i test futuri garantiranno che funzionifoo(9)
ancora).
- Per assicurarsi che un algoritmo che ha funzionato bene con approssimazioni quadratiche non abbia improvvisamente bisogno di approssimazioni cubiche o che un algoritmo che ha funzionato bene con il passo 0.1 non abbia improvvisamente bisogno di 0,01 per stabilità. Ancora una volta, questi potrebbero essere emulati da test di integrazione standard, ma l'obiettivo è ricordare quale sia il parametro di requisito più piccolo che ha raggiunto un determinato obiettivo, quindi ciò richiederebbe un sacco di aggiornamento manuale. Ad esempio, se in
Si potrebbe sostenere che ciò che sto chiedendo non descrive i test nel senso di test unitari / di integrazione, dal momento che un aumento dei tempi di esecuzione, ad esempio, potrebbe essere accettabile in cambio di altri miglioramenti.
In pratica, tuttavia, so che avrei risparmiato molto tempo nel debug se avessi avuto la funzionalità di test sopra, perché nel 95% dei casi i requisiti e le prestazioni sono andati male a causa dei bug che ho introdotto. In effetti, so per certo che molti bug che ho scoperto (dopo aver perso molto tempo a controllare il mio codice) con librerie di software numerico esterno avrebbero potuto essere evitati in modo banale se i test di cui sopra fossero stati applicati rigorosamente.
PS
La domanda simile denominata /programming/34982863/framework-for-regression-testing-of-numerical-code non è un duplicato in quanto descrive funzionalità che sono più facilmente ottenibili con i framework di test di regressione standard.
La domanda Strategie per test unitari e sviluppo guidato dai test richiede strategie rispetto a un framework che aiuta a implementarle (e le strategie che chiede / che sono fornite nelle risposte sono diverse da quelle che descrivo qui, secondo me).