¿Conjuntos de pruebas para aplicaciones numéricas en C ++?

13

Recientemente, he estado presionando a mi grupo para que incluya más pruebas al escribir su código. Hubo varios errores importantes que tomaron mucho más tiempo para detectar de lo que probablemente era necesario hablar, porque no teníamos un buen régimen de pruebas.

Sin embargo, sospecho que sería útil tener las herramientas adecuadas para automatizar (o ayudar a simplificar) el proceso. Por otro lado, no conozco las diversas opciones para las suites de prueba de C ++ y cómo decidir entre ellas.

¿Existen pautas sobre qué buscar, y hay alguna que esté específicamente orientada a las aplicaciones numéricas?

aeismail
fuente

Respuestas:

11

El problema con la prueba de códigos numéricos es que (i) es posible que no siempre conozca el resultado exacto y solo podrá guardar el resultado de un cálculo ahora para compararlo más adelante, es decir, para hacer pruebas de regresión, y (ii) los resultados pueden diferir en pequeñas cantidades en diferentes máquinas debido a diferentes redondeos.

Para ver cómo deal.II lo hace, eche un vistazo aquí: http://www.dealii.org/developer/development/testsuite.html#regression_tests

Wolfgang Bangerth
fuente
Buenos puntos sobre las limitaciones de las pruebas unitarias. La prueba de regresión es algo bueno (ciertamente mejor que no hacer ninguna prueba porque la salida es desconocida; puede dar señales de advertencia sobre errores). En cuanto al problema de redondeo de la máquina, ¿mitigar eso se convierte en elegir una buena tolerancia mediante prueba y error?
Geoff Oxberry
2
Es un dolor constante. En más de 10 años de pruebas, nunca hemos ideado una estrategia realmente buena para enfrentarlo. Usar numdiff en lugar de diff puede ayudar, pero en última instancia, debe designar una máquina para la que almacene "0.3987" en lugar del "0.3988" que obtiene en otra máquina cuando el número correcto es 0.39875. No importa dónde establezca el umbral, siempre cortará un número de otro en el lugar equivocado.
Wolfgang Bangerth
@WolfgangBangerth. Hay ciertos indicadores específicos del compilador que hacen que el comportamiento de coma flotante sea más determinista. Por ejemplo, / fp: estricta | precisa y / Qimf-arch-consistency: true (compilador Intel) o -fnounsafe-math-optimizations, -ffloat-store (GCC) puede hacer que su código sea más coherente y reproducible en todas las plataformas a costa del rendimiento . Con algunos ajustes, esto proporciona una construcción especial "reproducible", que puede usarse específicamente para pruebas.
André
@ Andre - oh sí, probamos todo esto. Todavía es difícil :-)
Wolfgang Bangerth
10

Recientemente he estado usando googletest para probar un par de bibliotecas numéricas en las que trabajo, y estoy muy contento con eso. Puede escribir pruebas bastante simples muy rápidamente o puede escribir pruebas complicadas que requieren inicialización de datos, etc. También proporciona (como estoy seguro de que muchos otros lo hacen) formas de hacer fácilmente comparaciones de punto flotante en lugar de bit a bit.

skillman
fuente
Lo bueno de googletest es que facilitan la inclusión de su código fuente en una aplicación, por lo que no tiene que hacerlo una dependencia.
Geoff Oxberry
4

Si está creando su código con CMake, entonces el mecanismo ctest sería la opción obvia. Le permite probar su código manualmente a través del comando ctesty también admite pruebas extensas nocturnas a través de CDash .

Nico Schlömer
fuente
1

Para nuestra biblioteca de C ++ de biología computacional ( Chaste ) utilizamos http://cxxtest.com/ . Esto es bastante simple de usar, funciona bien, proporciona algunas macros para probar con assert()declaraciones de estilo. Para la computación científica, estas son generalmente comparaciones directas simples TS_ASSERT_EQUALS(a,b)o con comparaciones numéricas con TS_ASSERT_DELTA(a,b,tolerance).

Las macros adicionales se pueden escribir fácilmente usando estas básicas para comparar sus propios vectores / matrices de elección también. De manera útil, también puede verificar que su código arroje advertencias y mensajes de error apropiados en situaciones determinadas. Puede buscar algunos ejemplos en las testcarpetas de nuestro código fuente aquí: https://chaste.cs.ox.ac.uk/trac/browser/trunk

mirams
fuente