2009-04-20 10 views
9

¿Alguien tiene alguna sugerencia para una mejor práctica o forma preferida de deshacer las transacciones de bases de datos realizadas desde un marco de prueba de integración como Selenium?Volver al inicio de la base de datos después de las pruebas de integración (Selenium)

Aquí está nuestra situación actual: Tenemos un proyecto web .net con un número de pruebas unitarias que funcionan bien en nuestro entorno de prueba unitario: cada prueba hereda una clase principal que abre una transacción en [SetUp] y rueda respalde la transacción en [TearDown]. Después de cada prueba, nuestra base de datos de prueba de la unidad se restaura al estado original.

Sin embargo, las cosas cambian una vez que llegamos a nuestro entorno de integración. Nuestro servidor de integración continua compila automáticamente nuestras confirmaciones y las envía a un servidor de prueba, para que el servidor siempre ejecute el código más actualizado. También hemos configurado una instancia de Selenium para automatizar la interacción del usuario con el sitio. Las pruebas de selenio básicamente se comunican con un servidor de Selenium existente y le dicen al servidor cosas como, "Inicie un navegador y vaya al http://testsite/TestPage.aspx - ingrese el texto 'abc' en el campo de formulario con id 'def' - afirme que la nueva página contiene texto 'xyz'"

Cada prueba se ejecuta de manera similar a nuestras pruebas de unidad de vainilla, pero con una excepción importante: cualquier cambio realizado por Selenium se realiza en un subproceso/aplicación completamente diferente, y por lo tanto no podemos (creo que no puede, al menos, hacerlos retroceder en el desmontaje de prueba.

Todavía tenemos que encontrar una buena solución para esto. En este momento estamos en un punto donde estamos usando un SqlCommand para ejecutar una instrucción sql para hacer una copia de seguridad de la base de datos, luego, al final de la prueba, estamos configurando la base de datos para un usuario único, eliminando la base de datos actual y restaurando la copia anterior: esto es menos que ideal, porque eso efectivamente mata a la aplicación que se adjuntó a la base de datos, y nos obliga a volver a inicializar la aplicación.

¿Es esto un problema que ha sido resuelto antes? Cualquier consejo sería asombroso.

Gracias!

Respuesta

3

Estamos ejecutando un script drop/create-table antes de cada prueba. Esto es bastante rápido y garantiza que no quede nada de las pruebas anteriores.

PD: Estamos utilizando NHibernate, que crea esta secuencia de comandos sobre la marcha y ejecuta la prueba en Sqlite en la memoria, es velocidad de la luz. Pero si cambiamos a SqlServer, todavía es bastante rápido.

+0

Gracias Stefan, Esta parece ser la mejor solución: hemos recurrido simplemente a truncar tablas y volver a cargar los accesorios después de cada prueba, que no es realmente * que * exigente, y parece que está funcionando bien. ¡Gracias de nuevo! – matt

+1

Truncar en Oracle es bastante rápido, porque no puede deshacer esta operación. Los guiones son fáciles en nuestra situación, los guiones ya están disponibles, no tenemos que mantener algo más. –

+0

¿Se ejecuta este script antes de cada método de prueba o caso de prueba? Asumiría todos los métodos de prueba ... ¿Cómo se ejecuta este script? ¿Tienes una API de servicio en la parte de atrás? – HDave

3

Es un problema difícil y la solución suele ser única para cada aplicación. Hasta que los principales marcos adopten un "enfoque recomendado", esto continuará siendo un dolor.

Mi mejor recomendación: planifique este uso al inicio de su aplicación. Incluya las API que se limpian después de que la base de datos se restablece desde debajo de la aplicación (es decir, restablecer los cachés).

Cuestiones relacionadas