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?