2016-06-07 18 views
8

Sono di fronte a questo problema da quando ho creato una serie di nuovi test di direttiva (in un progetto JHipster). I test dell'unità karma vengono eseguiti da un task grunt. Vorrei sottolineare con chiarezza che il mio problema è diverso da questi due (e pochi altri non mi è permesso di inviare) che ho trovato su GitHub:Test di unità Karma eseguiti ripetutamente in un ciclo infinito

https://github.com/karma-runner/karma/issues/1077

https://github.com/karma-runner/karma/issues/393

la differenza è quel karma non viene mai eseguito eseguendo i test, ma continua a eseguirli in un ciclo come se ci fosse un numero infinito di test nella posizione configurata. Può essere visto chiaramente sull'output della riga di comando:


Firefox 45.0.0 (Windows 7 0.0.0): Executed 321 of 192 (skipped 7) SUCCESS (0 secs/1 min 3.757 secs) 
Chrome 51.0.2704 (Windows 7 0.0.0): Executed 399 of 192 (skipped 11) SUCCESS (0 secs/1 min 2.239 secs) 
PhantomJS 2.1.1 (Windows 7 0.0.0): Executed 444 of 192 (skipped 11) SUCCESS (0 secs/1 min 0.515 secs) 

E va avanti all'infinito. Dopo quasi un'ora di esecuzione, questo è il risultato:


Chrome 51.0.2704 (Windows 7 0.0.0): Executed 20171 of 192 (skipped 472) SUCCESS (0 secs/50 mins 7.281 secs) 
Firefox 45.0.0 (Windows 7 0.0.0): Executed 3186 of 192 (skipped 72) DISCONNECTED (14 mins 48.503 secs/12 mins 16.547 secs) 
PhantomJS 2.1.1 (Windows 7 0.0.0): Executed 27054 of 192 (skipped 611) DISCONNECTED (48 mins 25.253 secs/47 mins 34.776 secs) 

Non importa se i test passano o falliscono, o perché non riescono (TypeError, ReferenceError...), i test eseguiti per sempre a prescindere (tutti i test passano qui, come si può vedere). L'esecuzione si interrompe solo se interrompo il task grunt nella riga di comando.

La configurazione del Karma e le attività del grunt non sono cambiate negli ultimi mesi. Le impostazioni Singlerun e Autowatch (così come tutte le altre) sono irrilevanti.

Il codice in prova sembra essere irrilevante. Alcuni cambiamenti, hanno reso il problema andare via per un po ', ma mentre scrivo nuovi test, torna sempre. Naturalmente all'inizio pensai che il mio codice fosse la colpa, ma i seguenti mostreranno perché non è una conclusione logica.

Lo strano comportamento inizia sempre quando si crea un nuovo test, ma il codice di test in sé sembra irrilevante, in quanto i nuovi test non utilizzano mai operazioni speciali o componenti di copertina che altri test non fanno. Inoltre, anche se il nuovo test è un corpo di funzione completamente vuoto, risulta comunque lo strano comportamento che suggerisce che non è un nuovo percorso decisionale nel programma che causa il problema se coperto da test. Questo è il motivo per cui non credo che il codice sia la colpa. Sono anche riuscito a interrompere l'esecuzione infinita disattivando test casuali (che usiamo molto tempo fa senza problemi), ma il problema è sempre tornato quando ho aggiunto nuovi test.

L'ambiente è irrilevante. I test si eseguono all'infinito sulla mia macchina Windows e in CI su un server Linux.

Ho anche pensato che potrebbe trattarsi di un problema di limitazione della memoria, perché per un po 'i browser si sono bloccati a un determinato test che non ha nulla a che fare con la nuova funzione oi nuovi test (e ha funzionato bene per mesi) . Quando ho disattivato il test, il problema è cessato per un po 'ma in seguito è tornato di nuovo (come ho continuato a scrivere test).

Ho aggiornato tutti i pacchetti NPM e i componenti Bower all'ultima versione, ma questo non ha modificato il ciclo infinito.

Ormai sono totalmente privo di idee. Qualcuno ha mai riscontrato un comportamento così strano e l'uscita della console?

+0

La stessa cosa ha iniziato a succedere a noi oggi - mi chiedo se ci sia stato un rilascio di karma/gelsomino/qualche altra dipendenza che potrebbe causare questo? –

+0

Deve essere stata una coincidenza che abbiamo avuto lo stesso problema allo stesso tempo! Vedere la mia risposta qui sotto per come l'abbiamo risolto. –

risposta

5

Abbiamo appena risolto questo problema esatto. Il problema era che abbiamo una funzione di disconnessione nella nostra applicazione che esegue varie attività prima di reindirizzare il browser a un'altra pagina. Uno dei nostri test che abbiamo aggiunto attorno alla nostra funzione di logout non stava prendendo in giro la finestra.reindirizzare la chiamata, e quando questo è stato eseguito da un test di karma eseguito ha causato il comportamento di loop.

Dopo aver deriso/spiato questa chiamata, il comportamento di interruzione si è arrestato.

Non sono sicuro se questo è lo stesso problema che si sta avendo, ma speriamo che questa informazione ti possa aiutare!

+0

Grazie, questo è stato di grande aiuto. C'è un sacco di test su un codice pace che fa scaricare una risorsa al browser: '$ window.location =" ... "'. Spiare quelle chiamate ha risolto il problema. L'unica cosa che continua a tormentarmi è che sono riuscito a fermare il loop alcune volte, ma è tornato quando ho scritto nuovi test. Pensi che il reindirizzamento possa causare perdite di memoria o simili, portando ad un consumo anomalo di memoria in ogni singolo test? Se questo è il caso, sono certo che il reindirizzamento derisorio risolve definitivamente il problema. Altrimenti temo che il ciclo tornerà di nuovo. – user436357

+0

Penso che questo comportamento sia dovuto al tempo necessario per il reindirizzamento, quindi più test aggiungi che esegui DOPO il reindirizzamento, maggiore è il tempo che stai dedicando al reindirizzamento da elaborare e quindi inizia il ciclo. In teoria, se il redirect sta avvenendo nell'ultimo test eseguito durante la corsa del karma, non vedrai il looping perché la corsa del karma termina prima che il reindirizzamento avvenga. –

+0

P.S. se ti piace la mia risposta per favore accettala :) –