Suite di test per applicazioni numeriche in C ++?


13

Di recente, ho spinto il mio gruppo a includere altri test durante la scrittura del loro codice. C'erano diversi bug importanti che impiegavano molto più tempo a catturare di quanto probabilmente fosse necessario parlare, perché non avevamo un buon regime di test in atto.

Tuttavia, sospetto che disporre di strumenti adeguati per automatizzare (o aiutare a semplificare) il processo sarebbe sicuramente utile. D'altra parte, non conosco le varie opzioni per le suite di test C ++ e come decidere tra di loro?

Ci sono linee guida su cosa cercare e ce ne sono alcune specificamente orientate verso applicazioni numeriche?

Risposte:


11

Il problema con il test dei codici numerici è che (i) potresti non sempre conoscere l'output esatto e sarai in grado di salvare il risultato di un calcolo solo ora per confrontarlo, ad esempio per fare test di regressione e (ii) che i risultati possono differire di piccole quantità su macchine diverse a causa di arrotondamenti diversi.

Per vedere come deal.II lo fa, dai un'occhiata qui: http://www.dealii.org/developer/development/testsuite.html#regression_tests


Aspetti positivi sui limiti dei test unitari. I test di regressione sono una buona cosa (sicuramente meglio di non provarli affatto perché l'output è sconosciuto; può dare segnali di avvertimento sui bug). Per quanto riguarda il problema dell'arrotondamento della macchina, la mitigazione si trasforma nella scelta di una buona tolleranza attraverso tentativi ed errori?
Geoff Oxberry,

2
È un dolore costante. In oltre 10 anni di test, non abbiamo mai escogitato una strategia davvero valida per affrontarlo. L'uso di numdiff invece di diff può aiutare, ma alla fine è necessario designare una macchina per la quale si memorizza "0.3987" invece di "0.3988" che si ottiene su un'altra macchina quando il numero corretto è 0.39875. Indipendentemente da dove imposti la soglia, taglierai sempre un numero di un altro nel punto sbagliato.
Wolfgang Bangerth,

@WolfgangBangerth. Esistono alcuni flag specifici del compilatore che rendono più deterministico il comportamento in virgola mobile. Ad esempio / fp: rigoroso | preciso e / Qimf-arch-coerenza: true (compilatore Intel) o -fnounsafe-math-ottimizzazioni, -ffloat-store (GCC) può rendere il codice più coerente e riproducibile su piattaforme a costo delle prestazioni . Con alcune modifiche, questo fornisce una speciale build "riproducibile", che può essere utilizzata specificamente per i test.
André

@Andre - oh sì, abbiamo provato tutti questi. È ancora difficile :-)
Wolfgang Bangerth,

10

Recentemente ho usato googletest per testare un paio di librerie numeriche su cui lavoro, e ne sono stato molto contento. Puoi scrivere test abbastanza semplici molto rapidamente o puoi scrivere test complicati che richiedono l'inizializzazione dei dati e così via. Fornisce anche (come sono sicuro che molti altri fanno) modi per fare facilmente confronti in virgola mobile piuttosto che bit a bit.


Una cosa bella di googletest è che rendono facile includere il suo codice sorgente in un'applicazione, quindi non devi renderlo una dipendenza.
Geoff Oxberry

4

Se stai costruendo il tuo codice con CMake, allora il ctest meccanismo sarebbe la scelta ovvia. Ti consente di testare il tuo codice manualmente tramite il comando cteste supporta anche numerosi test notturni tramite CDash .


1

Per la nostra libreria C ++ di biologia computazionale ( Casta ) utilizziamo http://cxxtest.com/ . Questo è abbastanza semplice da usare, funziona bene, fornisce alcune macro per il test con assert()dichiarazioni di stile. Per il calcolo scientifico si tratta in genere di semplici confronti diretti con TS_ASSERT_EQUALS(a,b)o confronti numerici con TS_ASSERT_DELTA(a,b,tolerance).

Le macro extra possono essere facilmente scritte usando queste di base per confrontare anche i propri vettori / matrici di scelta. Utilmente, puoi anche verificare che il tuo codice generi avvisi e messaggi di errore appropriati in determinate situazioni. Puoi sfogliare alcuni esempi nelle testcartelle del nostro codice sorgente qui: https://chaste.cs.ox.ac.uk/trac/browser/trunk

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.