Pregunta

Estoy trabajando en un entorno de prueba para un proyecto y estoy estudiando el uso de DbUnit.NET para realizar muchas de las pruebas de interacción de la base de datos. Aunque tengo una pregunta muy grande:

Estamos corriendo contra Oracle, y la configuración de una instancia de base de datos de prueba separada para cada desarrollador realmente no es factible (especialmente porque solo tenemos 1 DBA que ya está limitado por tiempo) Esto significa que todos los desarrolladores y el servidor de integración continua deben utilizar el mismo esquema de base de datos.

Entonces, pase a la pregunta: ¿existe una buena manera de evitar que más de 1 persona realice pruebas al mismo tiempo? Sería fácil colocar un registro en una tabla de base de datos que indique que se está ejecutando una prueba, luego eliminarlo una vez que las pruebas hayan finalizado, pero NUnit no tiene ninguna forma de ejecutar algo al inicio y al final de la sesión de prueba.

¿Algún otro pensamiento? Parece que debería ser un problema bastante común ... o ¿todos ejecutan realmente instancias de base de datos separadas para cada desarrollador / probador que pueda ejecutar las pruebas?

¿Fue útil?

Solución

Usamos una tabla ficticia con un solo registro como token de bloqueo cuando ejecutamos pruebas de base de datos para un grupo de desarrolladores en una base de datos compartida. De hecho, adquirimos el bloqueo para cada caso de prueba individualmente, de modo que un desarrollador que quiera ejecutar un caso de prueba no tenga que esperar a que finalice otro desarrollador que esté ejecutando todo el paquete. Hicimos que cada prueba configurara sus propios datos, sin transferencia entre métodos de prueba.

Utilizamos el mecanismo de bloqueo de la base de datos para en realidad poner en cola las pruebas en lugar de fallar cuando alguien más ya está ejecutando una prueba. Creo que el algoritmo de bloqueo de Oracle es un poco diferente, así que no sé cómo funcionaría.

El único lugar donde tuvimos problemas fue cuando un desarrollador quería pasar por una prueba en modo de depuración. Eso bloquearía a cualquier otro desarrollador que quisiera realizar una prueba hasta que él lanzara el depurador. Escribimos el nombre del usuario actual en una tabla ficticia, e hicimos que el mecanismo de bloqueo imprimiera un mensaje si se bloqueaba durante más de 30 segundos: "Bob está ejecutando una prueba y lo ha estado durante los últimos 5 minutos". p>

Esto estaba bien, pero era mucho trabajo mantener. Intentamos mantener un número pequeño de pruebas de base de datos y realizar la mayoría de nuestras pruebas como pruebas de unidad pura en la memoria.

Otros consejos

Puede usar el atributo [TestFixtureSetUp] para inyectar su marca que indica que las pruebas se están ejecutando como una forma de simular un " true " semáforo.

Algo que hice en un problema con algunas similitudes con este:

El programa tenía una variable de configuración que se agregó al frente de todos los elementos relevantes. Cada estación tenía su propia configuración, configurada correctamente no habría conflictos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top