C’è un modo per “fallire velocemente” per junit con il plugin di maven surefire?

Attualmente sto lavorando a un progetto Java usando Maven. Usiamo il plugin maven surefire per eseguire la nostra suite junit come parte del processo di compilazione.

La nostra suite di test sta crescendo rapidamente, sia in termini di copertura che di tempi di esecuzione. Il tempo di esecuzione è molto frustrante e richiede molto tempo quando si finisce per attendere dieci minuti per scoprire che un test non è riuscito nel primo minuto di test.

Mi piacerebbe trovare un modo per far fallire il processo di compilazione al primo errore / errore nella suite di test. So che questo è ansible per altri strumenti di costruzione, ma non sono riuscito a trovare un modo per farlo con Maven surefire.

So che c’è un ticket irrisolto per questa funzionalità nella jira infallibile, ma spero che ci sia una soluzione esistente là fuori per questo.

    A partire dal 6 settembre 2015 , sembra che ci sia , -Dsurefire.skipAfterFailureCount=1 .

    A partire dal 19 ottobre 2015 è stata rilasciata la versione 2.19 .

    Per quanto ne so, no , e questo richiede davvero la risoluzione di SUREFIRE-580 . Se vuoi che ciò accada più velocemente, dovresti almeno votare per il problema e, facoltativamente, inviare una patch;)

    Potrebbe esserci una soluzione adatta, ma dipende dalle tue esigenze e devi utilizzare un server CI in grado di gestire i codici di ritorno del processo jvm.

    L’idea di base è di interrompere del tutto il processo JVM di Maven e di far sapere al sistema operativo che il processo si è interrotto in modo imprevisto. Quindi, un server di integrazione continuo come Jenkins / Hudson dovrebbe essere in grado di verificare un codice di uscita diverso da zero e farti sapere che un test non è riuscito.

    Il primo passo è rendere sicuro l’uscita dalla JVM al primo fallimento del test. Puoi farlo con JUnit 4.7 o versioni successive usando un RunListener personalizzato (mettilo in src / test / java):

     package org.example import org.junit.runner.notification.Failure; import org.junit.runner.notification.RunListener; public class FailFastListener extends RunListener { public void testFailure(Failure failure) throws Exception { System.err.println("FAILURE: " + failure); System.exit(-1); } } 

    Quindi, è necessario configurare tale class in modo sicuro che lo registrerà con JUnit 4 Runner. Modifica il tuo pom.xml e aggiungi la proprietà di configurazione del listener al plugin maven-surefire. Sarà inoltre necessario configurare surefire per non imporre un nuovo processo JVM per l’esecuzione dei test. Altrimenti, andrà avanti con i prossimi casi di test.

      org.apache.maven.plugins maven-surefire-plugin 2.10  never   listener org.example.FailFastListener     

    Se questo non aiuta, proverei a bifare il plugin per il provider jav di maven surefire.

    Btw, i test unitari, per definizione, dovrebbero essere eseguiti più velocemente di 0,1 secondi. Se la tua build richiede davvero tanto tempo a causa dei test unitari, dovrai farli correre più velocemente in futuro.

    Alcuni modi per velocizzarlo se non esattamente quello di cui hai bisogno:

    • Se si tratta di una build multi modulo, aggiungere –fail-fast alla riga di comando per uscire dopo il primo modulo.

    • Cerca in sicurezza per spostare i test di integrazione di lunga durata in una fase diversa del ciclo di vita.

    • Guarda in una soluzione basata su profili per test veloci e lenti – C’è un modo per dire surefire di saltare i test in un determinato pacchetto? .

    Questa non è una risposta diretta alla domanda, ma può anche essere utile per alimentare l’output di maven tramite grep, per rimuovere la maggior parte delle cose e aiutarti a vedere dove sono i test falliti.

    Come questo:

     mvn test | grep -w 'Running\|Tests' 

    Che produce output (per il mio codice) in questo modo:

     Running scot.mygov.pp.test.dashboard.DashboardJsonSerDesCRUDTest Tests run: 26, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.029 sec Running scot.mygov.pp.test.dashboard.DashboardBaselineCRUDTest Tests run: 26, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.026 sec Running scot.mygov.pp.test.dashboard.DashboardDatabaseValidationTest Tests run: 7, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 2.264 sec Running scot.mygov.pp.test.dashboard.DashboardServiceWebServiceIsolationCRUDTest Tests run: 26, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.032 sec 

    Molto più facile vedere dove è il primo errore di fallimento.

    Puoi eseguire --fail-fast con l’opzione --fail-fast :

    L’opzione -ff è molto utile per gli sviluppatori che eseguono build interattivi che desiderano avere un feedback rapido durante il ciclo di sviluppo.

    un esempio può essere:

    mvn clean test -ff

    http://books.sonatype.com/mvnref-book/reference/running-sect-options.html

    Questo non risolve la domanda esattamente, ma la soluzione che il mio posto di lavoro è venuto alla fine è stata utilizzare Atlassian’s Clover per eseguire build specializzati di test relativi al codice modificato.

    Abbiamo una build Clover che esegue i test per il codice modificato e, a sua volta, dà il via alla compilazione completa del test.

    Questo ha dimostrato di essere una soluzione soddisfacente.