He tenido un poco de experiencia con las pruebas unitarias antes, en lo que llamo (no peyorativamente) el clásico proyecto de ingeniería de software: un MVC, con una GUI de usuario, una base de datos, lógica de negocios en la capa media, etc. Ahora ' m escribir una biblioteca de computación científica en C # (sí, sé que C # es demasiado lento, usar C, no reinventar la rueda, y todo eso, pero tenemos mucha gente haciendo computación científica en mi facultad en C #, y más o menos lo necesitamos). Es un proyecto pequeño, en términos de la industria de desarrollo de software, porque lo escribo principalmente solo, y de vez en cuando con la ayuda de algunos colegas. Además, no me pagan por ello, y lo más importante, es un proyecto académico. Quiero decir, espero que tenga calidad profesional algún día, porque planeo ir a código abierto,
De todos modos, el proyecto se está haciendo grande (alrededor de 18,000 líneas de código, que creo que es grande para el proyecto de un solo hombre), y se me está yendo de las manos. Estoy usando git para el control de fuente, y creo que me fue bastante bien, pero estoy probando como en la vieja escuela, quiero decir, escribiendo aplicaciones de consola completa que prueban una gran parte del sistema, principalmente porque no tengo idea de cómo hacer pruebas unitarias en este escenario, aunque creo que eso es lo que debería estar haciendo. El problema es que la biblioteca contiene principalmente algoritmos, por ejemplo, algoritmos gráficos, clasificadores, solucionadores numéricos, distribuciones aleatorias, etc. Simplemente no sé cómo especificar pequeños casos de prueba para cada uno de estos algoritmos, y dado que muchos de ellos son estocástico No sé cómo validar la corrección. Para la clasificación, por ejemplo, hay algunas métricas como precisión y recuperación, pero estas métricas son mejores para comparar dos algoritmos que para juzgar un solo algoritmo. Entonces, ¿cómo puedo definir la corrección aquí?
Finalmente, también está el problema del rendimiento. Sé que es un conjunto completamente diferente de pruebas, pero el rendimiento es una de las características importantes de las herramientas científicas, en lugar de la satisfacción del usuario u otras métricas de ingeniería de software.
Uno de mis mayores problemas es con las estructuras de datos. La única prueba que puedo encontrar para un árbol kd es una prueba de esfuerzo: inserte muchos vectores aleatorios y luego realice muchas consultas aleatorias, y compárelas con una búsqueda lineal ingenua. Lo mismo para el rendimiento. Y con los optimizadores numéricos, tengo funciones de referencia que puedo probar, pero nuevamente, esta es una prueba de esfuerzo. No creo que estas pruebas puedan clasificarse como pruebas unitarias, y lo más importante, ejecutarse continuamente, ya que la mayoría de ellas son bastante pesadas. Pero también creo que estas pruebas deben hacerse, no puedo simplemente insertar dos elementos, abrir la raíz, y sí, funciona para el caso 0-1-n.
Entonces, ¿cuál es el enfoque de prueba (unitario) para este tipo de software, si lo hay? ¿Y cómo organizo las pruebas unitarias y las pesadas en torno al ciclo de código-construcción-confirmación-integración?
fuente