configuration - MSTest ejecutando todas mis pruebas a la vez rompe las pruebas: qué hacer
(3)
Ok, esto es molesto.
MSTest ejecuta todas mis pruebas simultáneamente, lo que hace que algunas de ellas fallen. No, esto no se debe a que mis pruebas son frágiles y susceptibles de orden de compilación, sino porque se trata de un proyecto de demostración en el que utilizo una base de datos de objetos Db4o que se ejecuta desde un archivo.
Así que tengo un par de pruebas de DataAccess que comprueban que mis repositorios funcionan correctamente y están en auge, MSTest explota. Dado que intenta ejecutar todas sus pruebas al mismo tiempo, recibe un error cuando una prueba intenta acceder al archivo de la base de datos mientras que otras pruebas lo están utilizando.
¿Alguien puede pensar en una manera rápida de evitar esto? No quiero deshacerme de MSTest (está bien, pero sí otra historia) y estoy seguro de que no quiero ejecutar un servicio de base de datos en toda regla, así que intentaré forzar que MSTest no se ejecute simultáneamente o hacer trucos con abriendo archivos.
¿Alguien tiene alguna idea?
Es posible que desee probar a usar un Monitor e ingresar en TestInitialize y salir en TestCleanup. Si todas sus clases de prueba dependen del archivo externo, deberá usar un solo objeto de bloqueo para todas ellas.
public static class LockClass
{
public static object LockObject = new object();
}
...
[TestInitialize]
public void TestSetup()
{
Monitor.Enter(LockClass.LockObject);
}
[TestCleanup]
public void TestCleanup()
{
Monitor.Exit(LockClass.LockObject);
}
Esto debería obligar a que todas sus pruebas se ejecuten en serie y siempre que todas sus pruebas pasen o fallen, deberían ejecutarse. Sin embargo, si alguno de ellos lanza una excepción inesperada, todo el resto se bloqueará, ya que el código de salida no se ejecutará para la prueba que explote.
Tuve una oportunidad de usar cerraduras de esta manera. Lo que experimenté, sin embargo, fue que VS2010 no ejecuta las pruebas en paralelo de forma predeterminada, sino que las ejecuta secuencialmente, en un solo hilo. (Sin embargo, la ejecución en paralelo podría estar activada. Pero esto no evitaría el problema por completo)
Lo que me parece muy perturbador es que la ejecución secuencial se llevará a cabo en orden arbitrario, ¡incluso entre clases de prueba!
Entonces, por ejemplo, una orden de ejecución puede verse así:
- Clase A - TestInitialize: Se establecerá el bloqueo
- Clase A - TestMethod1: se ejecutará, OK
- Clase B - TestInitialize: Se establecerá el bloqueo => Se bloqueará el hilo => ¡Se bloquearán las Pruebas de unidad completas! La causa es que no hay otros subprocesos que sigan ejecutando métodos de Clase A. Por lo tanto, nunca se alcanzará el Montor.Exit ().
No entiendo por qué la EM lo está haciendo. Otros frameworks UnitTest (ej. JUnit) ejecutan los métodos de prueba en clase. De lo contrario, habrá algún entrelazado del método SetUp / TearDown que causaría el caos descrito ...
¿Hay alguien por ahí que sepa cómo evitar que MSTest salte entre clases de prueba? (Actualmente utilizo el corredor de pruebas Resharpers, que se comporta como se espera, ejecutando todos los métodos de prueba de una clase antes de continuar con la siguiente clase)
Utilice una prueba ordenada
http://msdn.microsoft.com/en-us/library/ms182630(v=VS.90).aspx