Testsuites für numerische Anwendungen in C ++?

13

Vor kurzem habe ich meine Gruppe dazu gedrängt, mehr Tests beim Schreiben ihres Codes einzubeziehen. Es gab einige große Fehler, deren Behebung viel länger dauerte, als es wahrscheinlich nötig gewesen wäre, da wir kein gutes Testverfahren eingerichtet hatten.

Ich vermute jedoch, dass die Verwendung geeigneter Tools zur Automatisierung (oder Optimierung) des Prozesses sicherlich nützlich wäre. Andererseits kenne ich die verschiedenen Optionen für C ++ - Testsuiten nicht und weiß nicht, wie ich mich zwischen ihnen entscheiden soll.

Gibt es Richtlinien, nach denen gesucht werden muss - und gibt es Richtlinien, die speziell auf numerische Anwendungen ausgerichtet sind?

aeismail
quelle

Antworten:

11

Das Problem beim Testen numerischer Codes besteht darin, dass (i) Sie möglicherweise nicht immer die genaue Ausgabe kennen und nur das Ergebnis einer Berechnung speichern können, um es mit einem späteren Wert zu vergleichen, dh um Regressionstests durchzuführen, und (ii) Diese Ergebnisse können auf verschiedenen Maschinen aufgrund unterschiedlicher Abrundung geringfügig abweichen.

Um zu sehen, wie deal.II das macht, schauen Sie hier: http://www.dealii.org/developer/development/testsuite.html#regression_tests

Wolfgang Bangerth
quelle
Gute Punkte zu den Einschränkungen von Komponententests. Regressionstests sind eine gute Sache (sicherlich besser als gar keine Tests, da die Ausgabe unbekannt ist; sie können Warnsignale für Fehler geben). Geht es bei der Maschinenrundung darum, eine gute Toleranz durch Ausprobieren zu wählen?
Geoff Oxberry
2
Es ist ein ständiger Schmerz. In mehr als 10 Jahren des Testens haben wir nie eine wirklich gute Strategie gefunden, um damit umzugehen. Die Verwendung von numdiff anstelle von diff kann hilfreich sein. Letztendlich müssen Sie jedoch einen Computer angeben, für den Sie "0.3987" anstelle von "0.3988" speichern, den Sie auf einem anderen Computer erhalten, wenn die richtige Nummer 0.39875 lautet. Egal wo Sie die Schwelle einstellen, Sie werden immer eine Nummer der anderen an der falschen Stelle abschneiden.
Wolfgang Bangerth
@WolfgangBangerth. Es gibt bestimmte compilerspezifische Flags, die das Gleitkommaverhalten deterministischer machen. Beispiel: / fp: strict | exact und / Qimf-arch-consistency: true (Intel-Compiler) oder -fnounsafe-math-optimizations, -ffloat-store (GCC) können Ihren Code auf Kosten der Leistung plattformübergreifend konsistenter und reproduzierbarer machen . Mit einigen Optimierungen wird ein spezieller "reproduzierbarer" Build bereitgestellt, der speziell für Tests verwendet werden kann.
André
@Andre - oh ja, wir haben alle ausprobiert. Es ist immer noch schwierig :-)
Wolfgang Bangerth
10

Ich habe kürzlich mit googletest ein paar numerische Bibliotheken getestet, an denen ich arbeite, und bin sehr zufrieden damit. Sie können ziemlich einfache Tests sehr schnell schreiben oder Sie können komplizierte Tests schreiben, die eine Dateninitialisierung usw. erfordern. Es bietet auch (wie ich sicher, dass es viele andere tun) Möglichkeiten, Gleitkommavergleiche einfach und nicht bitweise durchzuführen.

Skillman
quelle
Eine nette Sache bei googletest ist, dass sie es einfach machen, den Quellcode in eine Anwendung einzubinden, so dass Sie keine Abhängigkeit machen müssen.
Geoff Oxberry
4

Wenn Sie Ihren Code mit CMake erstellen , ist der ctest- Mechanismus die naheliegende Wahl. Sie können Ihren Code manuell über den Befehl testen ctestund umfangreiche nächtliche Tests über CDash durchführen .

Nico Schlömer
quelle
1

Für unsere computerbiologische C ++ - Bibliothek ( Chaste ) verwenden wir http://cxxtest.com/ . Dies ist recht einfach zu bedienen, funktioniert gut und bietet einige Makros zum Testen mit assert()style-Anweisungen. Für das wissenschaftliche Rechnen sind dies im Allgemeinen einfache direkte Vergleiche mit TS_ASSERT_EQUALS(a,b)oder numerische Vergleiche mitTS_ASSERT_DELTA(a,b,tolerance) .

Zusätzliche Makros können einfach mit diesen grundlegenden Makros geschrieben werden, um auch Ihre eigenen Vektoren / Matrizen zu vergleichen. Nützlicherweise können Sie auch überprüfen, ob Ihr Code in bestimmten Situationen entsprechende Warnungen und Fehlermeldungen ausgibt. Sie können einige Beispiele in den testOrdnern unseres Quellcodes hier durchsuchen : https://chaste.cs.ox.ac.uk/trac/browser/trunk

Mirams
quelle