¿Cuál es la forma correcta de configurar y generar una database con datos artificiales para testings de integración?

Digamos que tengo 2 tablas en una database, una llamada students y la otra llamada departments . students ve así:

 department_id, student_id, class, name, age, gender, rank 

y departments ve así:

 department_id, department_name, campus_id, number_of_faculty 

Tengo una API que puede consultar la database y recuperar diversa información de las 2 tablas. Por ejemplo, tengo un punto final que puede get el número de estudiantes en cada campus al unirme a las 2 tablas.

Quiero hacer testings de integración para mis puntos finales API. Para hacer eso, hago girar una database local, ejecuto la migration de los esquemas de la database para crear las tablas, luego llene cada tabla con loggings artificiales de manera que sé exactamente qué hay en la database. Pero proponer un buen process de siembra ha demostrado ser todo less fácil. Para el ejemplo simple que describí anteriormente, mi enfoque actual implica generar múltiples loggings distintos para cada columna. Por ejemplo, necesito al less 2 campus (por ejemplo, main y satellite ) y 3 departamentos (por ejemplo, Electrical Engineering y Mathematics para el campus main e English para el campus satellite ). Entonces necesito al less 2 estudiantes en cada departamento o 6 estudiantes en total. Y si combino el gender , la age y el rank , puede ver fácilmente que la cantidad de loggings artificiales crece exponencialmente. Venir con todos estos loggings artificiales es manual y tedioso de mantener.

Entonces mi pregunta es: ¿cuál es la forma correcta de configurar y crear una database para las testings de integración en general?

Primero, no conozco ninguna herramienta pública que automatice la tarea de generar datos de testing para escenarios arbitrarios.

En realidad, esta es una tarea difícil en general. Puede search artículos científicos y libros sobre el tema. Hay mayo de esos. Lamentablemente, no tengo ninguna recomendación sobre un set de "buenos".

Un enfoque bastante trivial es generar datos aleatorios extraídos de un set de valores potenciales por campo (columna en el caso de la database). (Esto es lo que ya hizo). Para sets más pequeños, puede incluso generar el set completo de combinaciones posibles. Por ejemplo, podría echarle un vistazo al siguiente generador de datos de testing para un ejemplo que aplica una variante de dicho enfoque.

Sin embargo, esto podría no ser apropiado por las siguientes razones:

  • los datos resultantes exhibirán una networkingundancia significativa, mientras que es posible que aún no cubran todos los casos interesantes.
  • podría crear datos inconsistentes con respecto a las restricciones lógicas que su aplicación impondría de otra manera (por ejemplo, integridad referencel)

Puede abordar estos problemas agregando algunas restricciones en el process de generación de datos de testing para eliminar combinaciones inválidas o networkingundantes (con respecto a su aplicación).

La restricción real posible (y que tiene sentido), sin embargo, depende de su negocio y casos de uso. Entonces, no hay una regla general sobre tales restricciones. Por ejemplo, si su API proporciona un tratamiento especial para los valores de edad basados ​​en las combinaciones de género de edad y sexo son importantes para sus testings, si no existe tal distinción, cualquier combinación de edad y sexo estará bien.

Siempre que esté buscando escenarios de testing de caja blanca , tendrá que poner sus detalles de implementación (o al less especificación).

Para las testings de caja negra , será suficiente un set completo de datos combinatorios. Entonces, solo networkingucir los datos de testing para mantener el time de ejecución de las testings dentro de un máximo es un problema.

Cuando se trata de testings de caja blanca , puede search explícitamente agregar en casos de esquina. Por ejemplo, en su caso: departamento sin ningún estudiante, departamento con un solo estudiante, estudiantes sin departamento, siempre que tal escenario tenga sentido con sus propósitos de testing. (por ejemplo, al probar el event handling errores o al probar cómo su aplicación trataría con datos inconsistentes).

En tu caso, estás viendo tu API como la vista principal de los datos. El contenido de la database es la input necesaria para lograr todos los resultados interesantes de esa API. La tarea real de identificar un contenido de database adecuado puede describirse por el problema matemático de proporcionar un inverso al mapeo proporcionado por su aplicación (desde el contenido de la database hasta el resultado de la API).

A falta de una herramienta list, puede aplicar los siguientes pasos:

  1. comenzar con un simple generador de datos combinatorio
  2. aplicar algunas restricciones eliminando loggings inútiles o ilegales
  3. ejecutar testings para capturar datos de cobertura agregar loggings de datos adicionales para mejorar la cobertura repetir las testings hasta que la cobertura esté bien

  4. revise y ajuste los datos después de cualquier cambio en su código o esquema

Creo que DbUnit podría ser la herramienta adecuada para lo que intentas hacer. Puede especificar el estado de su database antes de las testings y verificar el estado esperado después.

Si necesita inicializar la database con tablas y datos ficticios con Junit,

Estoy usando Unitils o DbUnit

Los datos en Unitils se pueden cargar desde files XML dentro de su carpeta de resources, por lo que una vez que se inicia el corrector de testing, cargará todo el contenido de xml e insertá en la database, por favor, mire los ejemplos en su website.