Bases de datos y el servidor CI

8

Tengo un servidor CI (Hudson) que felizmente construye, ejecuta pruebas unitarias y se implementa en el entorno de desarrollo, pero ahora me gustaría que ejecute las pruebas de integración.

Las pruebas de integración llegarán a una base de datos y esa base de datos se cambiará constantemente para contener los datos relevantes para la prueba en cuestión. Sin embargo, esto lleva a un problema: ¿cómo me aseguro de que la base de datos no esté siendo salpicada con datos para una prueba y luego que un segundo proyecto anule esos datos antes de que se complete el primer conjunto de pruebas?

Actualmente estoy usando el método de "esperanza", que no está funcionando demasiado mal en este momento, pero principalmente debido al hecho de que solo tenemos un pequeño número de pruebas de integración configuradas en CI.

Tal como lo veo, tengo las siguientes opciones:

  • Bases de datos de prueba locales (en memoria)
    No estoy seguro de si alguna de las bases de datos en memoria maneja todo el miedo de los desencadenantes y paquetes de Oracles, etc.
  • Bases de datos locales de CI Executor
    Se necesitaría una buena cantidad de trabajo para configurar esto y mantenerlos actualizados, pero definitivamente es una opción (la mayor parte del trabajo ya está hecho para mantener actualizada la base de datos de CI actual).
  • Ejecutor único de "prueba de integración"
    Probablemente sea el más fácil de implementar, pero significaría que las pruebas de integración podrían quedarse muy atrás.
  • Bloqueo de la base de datos (o conjunto de tablas)

Estoy seguro de que he perdido algunas formas (por favor agréguelas). ¿Cómo ejecuta pruebas de integración basadas en bases de datos en el servidor CI? ¿Qué problemas ha tenido y qué método recomienda? (Nota: aunque uso Hudson, estoy feliz de aceptar respuestas para cualquier servidor de CI, las ideas que estoy seguro serán portátiles, incluso si los detalles no lo son).

Saludos,
     Mlk

mlk
fuente
1
Esta pregunta de stackoverflow puede serle útil.
Michael K

Respuestas:

1

Es solo una idea, ya que nunca he hecho esto, pero podría configurar una tarea para obtener el DDL para el esquema de la base de datos con la que está probando y volver a crearlo en la memoria o en otra base de datos. Parece que es bastante simple en Oracle. Luego, puede generar automáticamente la nueva base de datos cada vez que cambie.

Parece que Oracle tiene una base de datos en memoria llamada TimesTen . Puede valer la pena mirarlo. Definitivamente preferiría usar una base de datos en memoria si es posible, ya que generalmente es más rápido que el almacenamiento duro.

Michael K
fuente
Intenté dbs en memoria hace unos años, pero me pareció mucho más lento que usar un DB real (estoy feliz de intentarlo de nuevo). La base de datos real existe con el esquema (pero sin contenido). La memoria interna debe iniciarse y crearse el esquema para cada prueba / ejecución de prueba. Jugaré a TimeTen y veré si puedo vincularlo a nuestro sistema actual de clonación de bases de datos y actualización de esquemas.
mlk
¿Quizás podría crear un singleton que contenga la referencia a la base de datos y simplemente limpiar las tablas después de cada prueba? Supongo que mi experiencia no ha sido con conjuntos de datos lo suficientemente grandes.
Michael K
He usado Apache Derby para esto, funciona.
Tim Williscroft
1

Ejecutamos pruebas de integración basadas en bases de datos al poner de pie un servidor de bases de datos para trabajar con el cuadro CI y alojar la instancia de CI. Algo así como cómo la preparación y la producción tienen cada uno su propio servidor de base de datos.

Wyatt Barnett
fuente
¿Cómo maneja los proyectos de pruebas múltiples que llegan a la misma base de datos al mismo tiempo, o tiene una base de datos por ejecutor?
mlk
2
Todos obtienen su propia base de datos (o bases de datos según sea necesario) en términos de servidor SQL, sin estar seguros de cómo se traduce eso en Oracle-land.
Wyatt Barnett
Suponiendo que estoy leyendo esto correctamente, ¿cada ejecutor de CI tiene su propia base de datos? ¿Cómo reconfigura la app.config (/ como se haya hecho la configuración de su base de datos) para cada ejecutor?
mlk
1
Nuevamente, no estoy seguro si estoy entendiendo su terminología aquí, pero para CI, configuramos la caja con las mismas convenciones que usamos en el equipo de desarrollo para que las cosas encajen en su lugar, por ejemplo, todos están usando la base de datos llamado "foo" en el servidor sql localhost \ SQLEXPRESS por lo que simplemente funciona.
Wyatt Barnett
Ah, ¿entonces ejecuta el db localmente o SQLEXPRESS es una base de datos en memoria? Si es local, esto lo limita a un solo ejecutor por instancia de CI.
mlk