Tester des suites pour des applications numériques en C ++?

13

Récemment, j'ai poussé mon groupe à inclure plus de tests lors de l'écriture de leur code. Il y avait plusieurs bugs majeurs qui ont pris beaucoup plus de temps à attraper que probablement parler était nécessaire, car nous n'avions pas un bon régime de test en place.

Cependant, je pense qu'il serait certainement utile d'avoir les outils appropriés pour automatiser (ou pour aider à rationaliser) le processus. D'un autre côté, je ne connais pas les différentes options pour les suites de tests C ++, et comment décider entre elles?

Existe-t-il des directives sur ce qu'il faut rechercher - et y en a-t-il qui sont spécifiquement axés sur les applications numériques?

aeismail
la source

Réponses:

11

Le problème avec les tests de codes numériques est que (i) vous ne connaissez pas toujours la sortie exacte et vous ne pourrez enregistrer le résultat d'un calcul que pour le comparer plus tard - c'est-à-dire pour faire des tests de régression, et (ii) que les résultats peuvent différer par petites quantités sur différentes machines en raison d'arrondis différents.

Pour voir comment deal.II le fait, jetez un œil ici: http://www.dealii.org/developer/development/testsuite.html#regression_tests

Wolfgang Bangerth
la source
Bons points sur les limites des tests unitaires. Les tests de régression sont une bonne chose (certainement mieux que de ne pas tester du tout parce que la sortie est inconnue; elle peut donner des signes d'alerte sur les bogues). En ce qui concerne le problème d'arrondi de la machine, est-ce que l'atténuation de ce problème passe par le choix d'une bonne tolérance par essais et erreurs?
Geoff Oxberry
2
C'est une douleur constante. En plus de 10 ans de tests, nous n'avons jamais trouvé de très bonne stratégie pour y faire face. L'utilisation de numdiff au lieu de diff peut aider, mais en fin de compte, vous devez désigner une machine pour laquelle vous stockez "0.3987" au lieu de "0.3988" que vous obtenez sur une autre machine lorsque le nombre correct est 0.39875. Peu importe où vous définissez le seuil, vous en couperez toujours un certain nombre au mauvais endroit.
Wolfgang Bangerth,
@WolfgangBangerth. Il existe certains indicateurs spécifiques au compilateur qui rendent le comportement en virgule flottante plus déterministe. Par exemple / fp: stricte | précision et / Qimf-arch-cohérence: true (compilateur Intel) ou -fnounsafe-math-optimisations, -ffloat-store (GCC) peut rendre votre code plus cohérent et reproductible sur toutes les plateformes au détriment des performances . Avec quelques ajustements, cela fournit une version spéciale "reproductible", qui peut être utilisée spécifiquement pour les tests.
André
@Andre - oh oui, nous avons essayé tout cela. C'est toujours difficile :-)
Wolfgang Bangerth
10

J'ai récemment utilisé googletest pour tester quelques bibliothèques numériques sur lesquelles je travaille et j'en suis très satisfait. Vous pouvez écrire des tests assez simples très rapidement ou vous pouvez écrire des tests compliqués qui nécessitent une initialisation des données, etc. Il fournit également (comme je suis sûr que beaucoup d'autres le font) des moyens de faire facilement des comparaisons à virgule flottante plutôt que sur le bit.

habile
la source
Une bonne chose à propos de googletest est qu'ils facilitent l'inclusion de son code source dans une application, vous n'avez donc pas à en faire une dépendance.
Geoff Oxberry
4

Si vous construisez votre code avec CMake, le mécanisme ctest serait le choix évident. Il vous permet de tester votre code manuellement via la commande ctest, et prend également en charge des tests nocturnes approfondis via CDash .

Nico Schlömer
la source
1

Pour notre bibliothèque C ++ de biologie computationnelle ( Chaste ), nous utilisons http://cxxtest.com/ . C'est assez simple à utiliser, fonctionne bien, il fournit quelques macros pour tester avec assert()des instructions de style. Pour le calcul scientifique, il s'agit généralement de comparaisons directes simples TS_ASSERT_EQUALS(a,b)ou de comparaisons numériques avec TS_ASSERT_DELTA(a,b,tolerance).

Des macros supplémentaires peuvent facilement être écrites en utilisant celles de base pour comparer vos propres vecteurs / matrices de votre choix. Utilement, vous pouvez également vérifier que votre code envoie des avertissements et des messages d'erreur appropriés dans des situations données. Vous pouvez parcourir quelques exemples dans les testdossiers de notre code source ici: https://chaste.cs.ox.ac.uk/trac/browser/trunk

mirams
la source