Ncrunch todas las pruebas pasan la primera ejecución, pero falla después del cambio de código y cuando se presiona el botón Ejecutar todo

StackOverflow https://stackoverflow.com//questions/12685690

  •  12-12-2019
  •  | 
  •  

Pregunta

Estoy ejecutando ncrunch, en una nueva solución MVC 4 en VS2012 usando nunit y ninject.

Cuando abro la solución por primera vez, las aproximadamente 50 pruebas se ejecutan y pasan con éxito.

Después de realizar cualquier cambio en el código (incluso solo agregar un espacio vacío), ncrunch informa que la mayor parte de mis pruebas unitarias fallan.Lo mismo sucede si presiono "ejecutar todas las pruebas" en la ventana de Ncrunch.

Pero si presiona el botón 'Ejecutar todas las pruebas visibles aquí', las 50 pruebas pasan nuevamente y ncrunch informa que todo está bien.

Además, cuando ejecuta cada prueba individualmente, pasan siempre.

Cuando fallan, parecen estar fallando en mi código de configuración de ninject

Error:TestFixtureSetUp falló en ControllerTestSetup

public class ControllerTestSetup
{

    [SetUp]
    public void InitIntegrationTest()
    {
        var context = IntegrationTestContext.Instance;
        context.Init();
        context.NinjectKernel.Load<MediGapWebTestModule>();
    }

    [TearDown]
    public void DisposeIntegrationTest()
    {
        IntegrationTestContext.Instance.Dispose();
    }
}

public class IntegrationTestContext : IDisposable
{  

    private static IntegrationTestContext _instance = null;
    private static readonly object _monitor = new object();

    private IntegrationTestContext() { }

    public static IntegrationTestContext Instance
    {
        get
        {
            if (_instance == null)
            {
                lock (_monitor)
                {
                    if (_instance == null)
                    {
                        _instance = new IntegrationTestContext();
                    }
                }
            }

            return _instance;
        }
    }
}

Todas las pruebas también se ejecutan en el corredor de pruebas Resharper sin problemas cada vez.

¿Alguien sabe qué podría estar causando esto?

Supongo que tiene algo que ver con el código de bloqueo singleton dentro de la propiedad de la Instancia, pero no estoy seguro.

==================================================== ============================ Progress:

Pude rastrear esto hasta un error en el método de configuración ninject anterior envolviéndolo en una declaración try catch y escribiendo el error en la ventana de salida.

La excepción se produjo al intentar cargar un módulo más de una vez, aunque definitivamente no lo he hecho y no uso ningún tipo de carga automática de módulos.

Esto sucede en las líneas

LocalSessionFactoryModule.SetMappingAssemblies(() => new[] { typeof(ProviderMap).Assembly });

_kernel.Load<LocalSessionFactoryModule>();
_sessionFactory = _kernel.Get<ISessionFactory>();

donde LocalSessionFactoryModule es la clase del módulo ninject derivada de la clase NinjectModule.

¿Por qué esto solo sucede con ncrunch y qué puedo hacer para resolver este problema?¿Hay alguna forma de comprobar si ya se ha cargado un módulo?

¿Fue útil?

Solución

NCrunch nunca ejecutará pruebas de forma simultánea dentro del mismo proceso, por lo que, a menos que tenga un comportamiento de subprocesos múltiples dentro de su lógica de prueba, entonces debería ser seguro decir que esto no es un problema causado por el bloqueo o subproceso sobre el singleton.

Como ya intentó deshabilitar la ejecución paralela y esto no hizo ninguna diferencia, supongo que el problema no sería causado por el uso simultáneo de recursos fuera del proceso del ejecutor de pruebas (es decir,archivos en el disco).

Esto significa que es casi seguro que el problema esté relacionado con la secuencia en la que se ejecutan las pruebas.Casi todos los ejecutores de pruebas manuales (incluido Resharper) ejecutarán pruebas en una secuencia definida de principio a fin.Esto es bueno para la coherencia, pero puede enmascarar problemas que pueden surgir cuando las pruebas se ejecutan en un orden inconsistente/aleatorio.NCrunch ejecutará pruebas en orden de prioridad y también puede reutilizar procesos de prueba entre ejecuciones de prueba, lo que puede hacer que el comportamiento de ejecución de sus pruebas sea diferente si no se han diseñado con esto en mente.

Una forma útil de sacar a la luz (y, por tanto, depurar) problemas relacionados con la secuencia es intentar ejecutar las pruebas en un orden definido manualmente mediante NCrunch.Si hace clic con el botón derecho en una prueba dentro de la ventana de pruebas de NCrunch, en el menú "Avanzado" encontrará una opción para ejecutar una prueba utilizando un proceso de ejecución de tareas existente.Pruebe esta acción con varias de sus pruebas para ver si puede reproducir la secuencia que plantea el problema.Cuando esto suceda, debería poder fácilmente poner un depurador en la prueba y descubrir por qué está fallando.

La mayoría de los problemas relacionados con la secuencia son causados ​​por miembros estáticos no borrados, así que asegúrese de que cada una de sus pruebas esté escrita asumiendo que otra prueba que se haya ejecutado dentro del proceso puede dejar el estado existente.Otra opción es garantizar que todo el estado esté completamente aprobado mediante pruebas de desmontaje (aunque, en mi opinión, este suele ser un enfoque menos pragmático).

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