Soy un gran defensor del desarrollo basado en pruebas en informática científica. Su utilidad en la práctica es asombrosa, y realmente alivia los problemas clásicos que los desarrolladores de códigos conocen. Sin embargo, existen dificultades inherentes al probar códigos científicos que no se encuentran en la programación general, por lo que los textos TDD no son terriblemente útiles como tutoriales. Por ejemplo:
En general, no conoce una respuesta exacta para un problema complejo dado a priori, entonces, ¿cómo puede escribir una prueba?
El grado de paralelismo cambia; Recientemente encontré un error en el que el uso de tareas MPI como múltiplo de 3 fallaba, pero un múltiplo de 2 funcionó. Además, los marcos de prueba comunes no parecen ser muy compatibles con MPI debido a la naturaleza misma de MPI: debe volver a ejecutar un binario de prueba para alterar la cantidad de tareas.
Los códigos científicos a menudo tienen muchas partes estrechamente acopladas, interdependientes e intercambiables. Todos hemos visto el código heredado, y sabemos lo tentador que es renunciar a un buen diseño y usar variables globales.
A menudo, un método numérico puede ser un "experimento", o el codificador no comprende completamente cómo funciona y está tratando de entenderlo, por lo que es imposible anticipar resultados.
Algunos ejemplos de pruebas que escribo para código científico:
Para los integradores de tiempo, use un ODE simple con una solución exacta y pruebe que su integrador lo resuelva con una precisión dada, y el orden de precisión es correcto al probar con diferentes tamaños de pasos.
Pruebas de estabilidad cero: verifique que un método con límite 0 / condiciones iniciales permanezca en 0.
Pruebas de interpolación: dada una función lineal, asegúrese de que una interpolación sea correcta.
Validación heredada: aísle un fragmento de código en una aplicación heredada que se sabe que es correcta y extraiga algunos valores discretos para usarlos en las pruebas.
Todavía a menudo surge que no puedo entender cómo probar adecuadamente un fragmento de código dado, aparte de la prueba y error manual. ¿Puede proporcionar algunos ejemplos de pruebas que escriba para código numérico y / o estrategias generales para probar software científico?
Respuestas:
Método de soluciones fabricadas .
Verificar mediante estudios de refinamiento que el método logra el orden teórico de precisión.
Conservación de la respuesta. Reproducción de soluciones a nivel de bits y norma.
fuente
Bill ya ha enumerado algunos métodos que abordan sus inquietudes.
Al abordar su tercer punto, no, no hay razón para introducir un fuerte acoplamiento entre las partes. Todo lo contrario: si sus funciones o clases tienen interfaces bien definidas, será mucho más fácil intercambiar, por ejemplo, un solucionador lineal por otro, o un esquema de paso de tiempo. Simplemente resístalo y podrás probar estos componentes por separado. Lo hemos hecho con deal.II durante décadas.
Para su cuarto punto: si su método es un experimento, sus experimentos con el método constituyen una prueba. Mientras no tenga un análisis, tendrá que tomar estos resultados de prueba como los mejores disponibles. Pero por lo general, tiene una expectativa, por ejemplo, para el orden de un método, o sabría que es exacto para una cierta clase de soluciones, por ejemplo, polinomios hasta cierto grado. La verificación de estos debe ser parte de sus experimentos y, a medida que el análisis mejora, se pueden agregar pruebas.
fuente
Recientemente encontré esta tesis sobre TDD en Ciencias Computacionales. Todavía no lo he leído, así que no tengo idea de si es bueno, pero espero que pueda ser de alguna ayuda.
http://cyber.ua.edu/files/2014/12/u0015_0000001_0001551.pdf
fuente