2011-02-04 15 views
5

Tengo un conjunto de casos de prueba MSTest que usan métodos con esos atributos para eliminar todas las filas de las tablas en el db de prueba creado después de iniciar las pruebas; de vez en cuando termino con una fila de una de las pruebas unitarias todavía en la base de datos.Bajo qué circunstancias [ClassCleanup] y [TestCleanup] no se ejecutan

Como estoy guardando la hora de inicio de la prueba y borrando todos los registros con marcas de tiempo más recientes, la única forma en que puedo ver que los registros sobrevivan es si no se llamó al código de limpieza.

+0

¿Te refieres a NUnit, MSTest u otro marco de prueba? – adamjford

Respuesta

4

Bueno, primero, una "prueba de unidad" técnicamente no debería tocar la base de datos. Pero, uso NUnit para mis pruebas de integración también, así que no hay problema.

Las únicas circunstancias en las que los métodos de limpieza no se ejecutarían en su totalidad son si hubo un error en la función de limpieza o si una excepción provocó que el tiempo de ejecución se apagara. Los únicos que sé que pueden hacer son los errores de desbordamiento de pila y de falta de memoria. Si cancela una prueba del depurador, también se omitirá la fase de limpieza.

Una explicación más probable, dependiendo de su capa de acceso a datos, es que perdió su conexión de base de datos y la función de limpieza no pudo obtener una nueva. En general, esto indicaría la necesidad de hacer que su DAL sea más robusto, y también indica que algo que no está esperando sucederá en la prueba para hacer que el DAL se descomponga.

+0

al menos algunos de estos son lo que consideraría una mayor integración que las pruebas unitarias estrictas; habiendo heredado el proyecto, sigo tratando de entender lo que los desarrolladores anteriores habían hecho. Siempre he sentido los puntos de vista de los puristas sobre lo que no se debe hacer en las pruebas más bien tonto; especialmente porque no hay un conjunto paralelo equivalente de herramientas para ejecutar otras pruebas automatizadas. La base de datos se está ejecutando en el host local, por lo que perder la conexión me parece un poco improbable. –

+0

Cuán "tontas" son las reglas para varios niveles de prueba dependen de su cultura de trabajo. Una diferencia clave, la mayoría de las veces, es que las pruebas unitarias se ejecutan muy rápido, por lo que se pueden ejecutar en cada registro cuando se usa un servidor de CI. He visto suites de prueba de integración que duran horas y, en cualquier caso, normalmente las ejecuta con menos frecuencia. – KeithS

1

Si está depurando las pruebas y detiene el depurador antes de que finalice la ejecución de prueba, no se invocará.

Cuestiones relacionadas