NCCunch Tutto il test PASS PRIMA RUN, ma non riesce dopo la modifica del codice e quando viene premuto tutto il pulsante

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

  •  12-12-2019
  •  | 
  •  

Domanda

Sto eseguendo NcRunch, in una nuova soluzione MVC 4 in VS2012 utilizzando NUnit e Ninject.

Quando apporto la soluzione per la prima volta tutto 50 o in modo di test e passano correttamente.

Dopo aver effettuato qualsiasi modifica del codice (anche solo uno spazio vuoto aggiunto) ncrunch riporta che la maggior parte del mio test dell'unità fallisce. La stessa cosa accade se premerò "Esegui tutti i test" nella finestra NcRunch.

Ma se premi il pulsante "Esegui tutti i test visibili qui" tutti i 50 Test Pass Pass e NcRunch Segnala Tutto va bene.

Anche quando si esegue ciascun test singolarmente passano ogni volta.

Quando falliscono non sembrano fallire nel mio codice di installazione del ninject

Errore: testFixTureSetup non riuscito in 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;
        }
    }
}
.

Tutto il test viene eseguito anche nel runner di test Resharper senza problemi ogni volta.

Qualcuno sa cosa potrebbe causare questo?

Immagino che sia qualcosa a che fare con il codice di blocco Singleton all'interno della proprietà dell'istanza, ma non ne sono sicuro.

==============================================================================. Progresso:

Sono stato in grado di monitorarlo a un errore nel metodo di installazione Ninject sopra avvolgendolo in un'istruzione Try Catch e scrivendo l'errore nella finestra di uscita.

L'eccezione è stata causata dal tentativo di caricare un modulo più di una volta, anche se non ho sicuramente e non uso alcun tipo di caricamento automatico del modulo.

Questo succede sulle linee

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

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

DOVE LOGALSESSIONSESSESSESSESSESSESSEPROYMODULE è la classe del modulo NINOJECT derivata per la classe NinyModule.

Perché questo è solo accadendo con NcRunch e cosa posso fare per risolvere questo problema? C'è un modo per verificare se un modulo è già stato caricato?

È stato utile?

Soluzione

NcRunch non eseguirà mai la concorrenza dei test all'interno dello stesso processo, quindi a meno che tu non abbia un comportamento multi-thread all'interno della logica del test, dovrebbe essere sicuro per dire che questo non è un problema causato dal blocco o dal filetto sul Singleton .

Come hai già provato a disabilitare l'esecuzione parallela e questo non ha fatto la differenza, sto supponendo che il problema non venisse causato da un uso simultaneo delle risorse al di fuori del processo di test runner (IE file su disco).

Ciò significa che il problema è quasi certamente correlato alla sequenza in cui vengono eseguiti i test. Quasi tutti i test di test manuali (incluso ReshArper) eseguiranno test in una sequenza definita dall'inizio alla fine. Questo è buono per la coerenza, ma può mascherare i problemi che possono accoppiare quando i test vengono eseguiti in un ordine incoerente / casuale. NcRunch eseguirà test in ordine di priorità e può anche riutilizzare i processi di prova tra le corse di prova, che possono rendere il comportamento di runtime dei tuoi test diversi se non sono stati progettati in mente.

Un modo utile per superficie (e quindi eseguire il debug) I problemi relativi alla sequenza è di provare a eseguire i test in un ordine definito manualmente utilizzando NCRUNGH. Se fai clic con il pulsante destro del mouse su un test all'interno della finestra dei test NCRUNCH, sotto il menu 'Avanzate' troverai un'opzione per eseguire un test utilizzando un processo di esecuzione dell'attività esistente. Prova questa azione contro molti dei tuoi test per vedere se riesci a riprodurre la sequenza che superfici il problema. Quando succede, dovresti essere facilmente in grado di ottenere un debugger sul test e scoprire perché è fallito.

La maggior parte dei problemi correlati alla sequenza sono causati da membri statici non chiariti, quindi assicurati che ciascuno dei test sia scritto nel presupposto che lo stato esistente possa essere lasciato indietro da un altro test che è stato eseguito all'interno del processo. Un'altra opzione è garantire che tutto lo stato sia completamente cancellato dai test su Tranch Down (anche se a mio avviso, questo è spesso un approccio meno pragmatico).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top