2016-03-14 32 views
6

Ho installato l'ultima versione di NUnit (3.2.0) e ho eseguito tutti i miei test in parallelo. Potrebbe sembrare un comportamento desiderabile ma non l'ho chiesto e in realtà ha rotto alcuni dei miei test. Ho un'inizializzazione in [OneTimeSetUp] che dipende dal thread e sembra che non possa fare nulla per forzare NUnit a eseguire i miei test in modo sequenziale. Ho letto il documentation e afferma che per impostazione predefinita i test non vengono eseguiti in parallelo ma in realtà lo sono!NUnit 3: vietare test da eseguire in parallelo

Inoltre, ho provato ad aggiungere il seguente attributo: [assembly: Parallelizable(ParallelScope.None)] - senza fortuna.

Qualcuno sa come modificare questo comportamento?

P.S. Lo eseguo con ReSharper ma ho anche provato con il componente aggiuntivo MSVS.


UPD: sto usando MVVM luce DispatcherHelper.Initialize() (all'interno [OneTimeSetUp]) per memorizzare l'oggetto dispatcher che viene poi utilizzata da un paio di test. Se i thread sono diversi (tra un test e il metodo di installazione), l'azione sotto test viene eseguita in modo asincrono e i miei test falliscono.

Ho controllato gli ID di thread in diversi test e sono tutti diversi.


UPD2: Estratto dalla documentazione:

Il 3.0 quadro NUnit in grado di eseguire test in parallelo all'interno di un assemblaggio. Questa è una funzione completamente separata dall'Engine Esecuzione test parallelo, sebbene sia possibile utilizzare entrambi nello stesso ciclo di prova dello .

Per impostazione predefinita, non viene eseguita l'esecuzione parallela. Gli attributi vengono utilizzati per indicare quali test possono essere eseguiti in parallelo e in che modo si riferiscono agli altri test .

Se ciò non significa che i test all'interno di un assieme non devono essere eseguiti in parallelo fino a quando non vengono specificati esplicitamente cosa significa? E perché [assembly: Parallelizable(ParallelScope.None)] non ha alcun effetto sull'esecuzione parallela dei test?


UPD3: Risposta alla domanda potrebbe essere trovata al di sotto, ma se si sono bloccati (come mi è stato) con la DispatcherHelper.Initialize() è sufficiente rimuovere questo l'inizializzazione dal OneTimeSetUp e mettere le seguenti righe in ogni test che utilizza un dispatcher:

DispatcherHelper.Reset(); 
DispatcherHelper.Initialize(); 
+0

I test potrebbero non essere eseguiti in parallelo, è probabile che siano in esecuzione in un thread diverso rispetto a OneTimeSetup. Stai memorizzando informazioni nella memoria locale del thread? –

+0

Spiegare cosa intendi per "thread-dependent" Nulla in NUnit garantisce che i test vengano eseguiti sullo stesso thread – Charlie

+0

@RobProuse, aggiornata la domanda – ixSci

risposta

12

NUnit non garantisce che tutti i test verrà eseguito sullo stesso filo, così l'osservazione che i test vengono eseguiti su diversi thread non significa che sono in esecuzione in parallelo.

La documentazione indica solo che i test verranno eseguiti in sequenza o in parallelo. Si può interpretare che ciò significa che vengono eseguiti sullo stesso thread, ma esistono molte ragioni per cui l'implementazione interna potrebbe richiedere test per l'esecuzione su thread diversi. Timeout è un esempio, in cui generiamo un thread e lo uccidiamo se il test scade, ma ce ne sono molti altri.

I test paralleli sono nuovi in ​​NUnit 3, quindi l'implementazione interna è stata modificata da NUnit 2. Un attributo che forza tutti i test all'interno di un thread per essere eseguiti sullo stesso thread potrebbe essere utile, quindi non esitate a inviare un enhancement request.

Spiacente, non ho familiarità con MVVM Light, quindi non posso suggerire modi per eseguire il marshalling nel thread OneTimeSetup.

Aggiornamento - Poiché questo è un uso comune con il web e asincrono, il team di NUnit ha deciso di fornire un attributo che richiederà test essere eseguiti sullo stesso thread come OneTimeSetup del proiettore. Questo sarà nella prossima versione, 3.4 o in una versione di aggiornamento rapido 3.2.1. Se si desidera tenere traccia dell'avanzamento, vedere issue e pull request.

Update 2 - È ora possibile aggiungere SingleThreadedAttribute ad un TestFixture per indicare al corridore che la OneTimeSetUp, OneTimeTearDown e tutti i test del bambino deve essere eseguito sullo stesso thread.

+0

Grazie per la risposta. Non pensi che sarebbe opportuno menzionare che i test potrebbero essere eseguiti sui diversi thread anche in modo non parallelo? In qualche posto importante, penso. Questa risposta dovrebbe essere d'aiuto, perché ora sarebbe facile fare un simile comportamento su Google, ma penso anche che la documentazione dovrebbe in qualche modo menzionarla. – ixSci

+0

È difficile scrivere questo tipo di documentazione in anticipo perché è difficile sapere quali ipotesi possono essere fatte dagli utenti. Così ora vediamo che questo dovrebbe unirsi ad altri che già sapevamo. :-) – Charlie

+1

Posso aggiungere una pagina dei documenti chiamata "Cose che non devi assumere" :-) Per ora, ecco un mucchio di false ipotesi che ho trovato nel corso degli anni: (1) Non dare per scontato che il tuo costruttore sia solo chiamato una volta per correre da NUnit (2) Non dare per scontato che il test sia in esecuzione su un thread univoco - anche se puoi chiedere a NUnit di farlo (3) Non dare per scontato che i tuoi test siano tutti eseguiti sullo stesso thread (4) Don Supponiamo che i test siano eseguiti nell'ordine in cui appaiono nel file sorgente o in ordine alfabetico. Seriamente, si prega di postare suggerimenti per tale pagina su github, https: github.com/nunit/docs – Charlie

0

È possibile impedire l'esecuzione in parallelo dei test aggiungendo l'attributo [NonParallelizable], che può essere aggiunto in test, classe e livello di assemblaggio.

Problemi correlati