test di JUnit Poor utilizzando Spring Framework ha chiamate fragile Thread.Sleep (). Come risolvere?
-
09-10-2019 - |
Domanda
Recentemente ho aderito a un gruppo con alcuni problemi di test JUnit gravi. Un problema è un test lungo 8 minuti! Il test ha diverse sezioni; ciascuno fa chiamate a org.springframework.context.ApplicationEventPublisher.publishEvent () seguita da Thread.sleep () di varie quantità di tempo, quindi verifica condizioni.
Ci sono diversi problemi evidenti con questo approccio, i tempi del Thread.sleep () chiamate è fragile:
-
test di tanto in tanto non su macchine occupato; e
-
test prendere troppo a lungo quando non sicuro.
è la piscina su cui questi eventi vengono gestiti accessibili per testare e c'è una chiamata per vedere se la cascata evento è inoperanti?
Soluzione
È possibile sovrascrivere il applicationEventMulticaster
di default aggiungendo questo id di fagioli al contesto di applicazione.
Al posto della SimpleApplicationEventMulticaster
di default, è possibile impostare un TaskExecutor su questo fagiolo per eseguire l'evento editoriale in modo asincrono in più thread.
In alternativa è possibile implementare il proprio multicaster, che stampa che listener di eventi voluto così tanto tempo o è stato il blocco, per quanto tempo e in quali eventi. Questo potrebbe aiutare a rintracciare il vero problema del 8 minuti-Testcase.
È interessante notare che il JavaDoc del SimpleApplicationEventMulticaster, che viene utilizzato di default entro la primavera quando si utilizza ApplicationContext, afferma quanto segue:
Per impostazione predefinita, tutti gli ascoltatori sono invocato il thread chiamante. Questo permette il pericolo di un ascoltatore ladro bloccando l'intera applicazione , ma aggiunge overhead minimo. Specificare un TaskExecutor alternativa avere ascoltatori eseguite in varie filettature, per esempio da un pool di thread.
Altri suggerimenti
degno di nota è che il codice di prova che chiama in realtà i servizi esterni sono i test di integrazione e non unit test. Se siete veramente unit testing qui si dovrebbe sostituire quelle chiamate con schernisce. In questo modo è possibile controllare meglio i valori restituiti per la logica di business e di prova per condizioni specifiche. Inoltre, come avete visto, tutto questo ma elimina i falsi positivi a causa di situazioni esterne (non di codice). Ovviamente questi test non stanno fallendo, l'impianto che si aspettano da utilizzare è.
I (volutamente) Evitare di primavera, quindi non sono sicuro di poter aiutare con le specifiche, ma solo guardando il problema del sonno, si può usare qualcosa di simile WaitFor
in tempus fugit-(senza vergogna) per sondaggio per un Condition
piuttosto che "sonno e di speranza". Non è l'ideale e di solito un cambiamento nel modo in cui si prova (come suggerito in precedenza) è preferibile ma significa si ottiene a grana più fine "attende" che sono più probabilità di evitare di gara-condizioni / test traballante e in generale accelerare il test.
documentazione del progetto per i dettagli e di nuovo post, se lo trovate utile!