test di JUnit Poor utilizzando Spring Framework ha chiamate fragile Thread.Sleep (). Come risolvere?

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

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?

È stato utile?

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!

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