No soy ingeniero de software. Soy un estudiante de doctorado en el campo de la geociencia.
Hace casi dos años comencé a programar un software científico. Nunca utilicé la integración continua (CI), principalmente porque al principio no sabía que existía y era la única persona que trabajaba en este software.
Ahora, dado que la base del software se está ejecutando, otras personas comienzan a interesarse en él y desean contribuir al software. El plan es que otras personas en otras universidades estén implementando adiciones al software central. (Tengo miedo de que puedan introducir errores). Además, el software se volvió bastante complejo y se volvió cada vez más difícil de probar y también planeo continuar trabajando en él.
Debido a estas dos razones, ahora estoy cada vez más pensando en usar CI. Como nunca tuve una educación en ingeniería de software y nadie a mi alrededor ha oído hablar de CI (somos científicos, no programadores), me resulta difícil comenzar mi proyecto.
Tengo un par de preguntas en las que me gustaría obtener algunos consejos:
En primer lugar, una breve explicación de cómo funciona el software:
El software está controlado por un archivo .xml que contiene todas las configuraciones requeridas. Inicia el software simplemente pasando la ruta al archivo .xml como argumento de entrada y se ejecuta y crea un par de archivos con los resultados. Una sola carrera puede tomar ~ 30 segundos.
Es un software científico. Casi todas las funciones tienen múltiples parámetros de entrada, cuyos tipos son principalmente clases que son bastante complejas. Tengo varios archivos .txt con grandes catálogos que se utilizan para crear instancias de estas clases.
Ahora pasemos a mis preguntas:
pruebas unitarias, pruebas de integración, pruebas de extremo a extremo? : Mi software ahora tiene alrededor de 30,000 líneas de código con cientos de funciones y ~ 80 clases. Me parece un poco extraño comenzar a escribir pruebas unitarias para cientos de funciones que ya están implementadas. Entonces pensé en simplemente crear algunos casos de prueba. Prepare 10-20 archivos .xml diferentes y deje que se ejecute el software. Supongo que esto es lo que se llama pruebas de extremo a extremo. A menudo leo que no deberías hacer esto, pero ¿tal vez está bien para empezar si ya tienes un software que funciona? ¿O es simplemente una tonta idea intentar agregar CI a un software que ya funciona?
¿Cómo se escriben las pruebas unitarias si los parámetros de la función son difíciles de crear? Supongo que tengo una función
double fun(vector<Class_A> a, vector<Class_B>)
y, por lo general, primero tendría que leer en varios archivos de texto para crear objetos de tipoClass_A
yClass_B
. Pensé en crear algunas funciones ficticias, comoClass_A create_dummy_object()
sin leer en los archivos de texto. También pensé en implementar algún tipo de serialización . (No planeo probar la creación de los objetos de clase ya que solo dependen de múltiples archivos de texto)¿Cómo escribir pruebas si los resultados son muy variables? Mi software utiliza grandes simulaciones monte-carlo y funciona de forma iterativa. Por lo general, tiene ~ 1000 iteraciones y en cada iteración, está creando ~ 500-20,000 instancias de objetos basados en simulaciones monte-carlo. Si solo un resultado de una iteración es un poco diferente, las próximas iteraciones completas son completamente diferentes. ¿Cómo lidias con esta situación? Supongo que este es un gran punto en contra de las pruebas de extremo a extremo, ya que el resultado final es muy variable.
Cualquier otro consejo con CI es muy apreciado.