Descubrí que gran parte de mi programación de ciencias computacionales tiene requisitos de prueba que no están cubiertos por los marcos de prueba estándar:
Prueba de tiempo de computación
- Para asegurarse de que los algoritmos no sean más lentos. Podría hacer algo como,
assureSmallerEqual(RuntimeWrapper(algorithm),53)
pero me gustaría que el umbral de 53 segundos se reduzca continuamente mientras estoy trabajando en el algoritmo, es decir, algo comoassureSmallerEqual(RuntimeWrapper(algorithm),'previousbest+noisetolerance')
- Para asegurarse de que los algoritmos no sean más lentos. Podría hacer algo como,
Pruebas de rendimiento
- Para asegurarse de que un algoritmo que previamente encontró una buena aproximación a una solución analítica todavía encuentre una solución que sea al menos tan buena o mejor. Nuevamente, esto podría ser emulado por una prueba de integración estándar, pero me gustaría que la tolerancia se reduzca continuamente a medida que el algoritmo mejora y mejora. Piense en reemplazar
assureAlmostEqual(foo(),1,places=3)
porassureAlmostEqual(foo(),1,places='previousbest')
- Para asegurarse de que un algoritmo que previamente encontró una buena aproximación a una solución analítica todavía encuentre una solución que sea al menos tan buena o mejor. Nuevamente, esto podría ser emulado por una prueba de integración estándar, pero me gustaría que la tolerancia se reduzca continuamente a medida que el algoritmo mejora y mejora. Piense en reemplazar
Pruebas de requisitos físicos.
- Para asegurarse de que los algoritmos no necesiten repentinamente más memoria / espacio en el disco duro. Muy similar a 1.
Prueba de requisitos abstractos
- Para asegurarse de que un algoritmo que funcionó bien con aproximaciones cuadráticas no necesita repentinamente aproximaciones cúbicas, o que un algoritmo que funcionó bien con el paso de tiempo 0.1 no necesita repentinamente 0.01 para estabilidad. Una vez más, estos podrían ser emulados por pruebas de integración estándar, pero el objetivo es recordar cuál fue el parámetro de requisito más pequeño que logró cierto objetivo, por lo que esto requeriría una gran cantidad de actualización manual. Por ejemplo, si
foo(10)
anteriormente no arrojaba excepciones, me gustaría que el marco se asegurara de quefoo(10)
aún funcionara y también probar sifoo(9)
ahora funciona (en cuyo caso todas las pruebas futuras garantizarían quefoo(9)
todavía funcione).
- Para asegurarse de que un algoritmo que funcionó bien con aproximaciones cuadráticas no necesita repentinamente aproximaciones cúbicas, o que un algoritmo que funcionó bien con el paso de tiempo 0.1 no necesita repentinamente 0.01 para estabilidad. Una vez más, estos podrían ser emulados por pruebas de integración estándar, pero el objetivo es recordar cuál fue el parámetro de requisito más pequeño que logró cierto objetivo, por lo que esto requeriría una gran cantidad de actualización manual. Por ejemplo, si
Se podría argumentar que lo que estoy pidiendo no describe las pruebas en el sentido de pruebas de unidad / integración, ya que el aumento de los tiempos de ejecución, por ejemplo, podría ser aceptable a cambio de otras mejoras.
Sin embargo, en la práctica, sé que habría ahorrado mucho tiempo de depuración si tuviera la funcionalidad de prueba anterior, porque en el 95% de los casos los requisitos y el rendimiento no funcionaron debido a los errores que introduje. De hecho, sé con certeza que muchos errores que encontré (después de perder mucho tiempo comprobando mi propio código) con bibliotecas externas de software numérico podrían haberse evitado trivialmente si las pruebas anteriores se hubieran aplicado rigurosamente.
PD
La pregunta con el mismo nombre /programming/34982863/framework-for-regression-testing-of-numerical-code no es un duplicado, ya que describe la funcionalidad que es más fácil de lograr con los marcos de prueba de regresión estándar.
La pregunta Estrategias para pruebas unitarias y desarrollo basado en pruebas pide estrategias en lugar de un marco que ayuda a implementarlas (y las estrategias que solicita / que se proporcionan en las respuestas son diferentes de lo que describo aquí, en mi opinión).