2009-12-17 8 views
28

Actualmente estoy trabajando en un proyecto de Java usando maven. Usamos el plugin maven surefire para ejecutar nuestra suite junit como parte del proceso de compilación.¿Hay alguna manera de "fallar rápido" para junit con el plugin maven surefire?

Nuestro conjunto de pruebas está creciendo rápidamente, tanto en tiempo de cobertura como de ejecución. El tiempo de ejecución es muy frustrante y consume mucho tiempo cuando termina esperando diez minutos para descubrir que una prueba falló en el primer minuto de prueba.

Me gustaría encontrar una manera de hacer que el proceso de compilación falle en el primer error/falla en el conjunto de pruebas. Sé que esto es posible para otras herramientas de compilación, pero no he podido encontrar la manera de hacerlo con Mavenfirefire.

Sé que hay an unresolved ticket for this functionality en la jira surefire, pero espero que exista una solución existente para esto.

+0

Me temo que la respuesta es, probablemente, "No, no lo es." – BryanD

Respuesta

20

A partir del 6 de septiembre de 2015 it appears there is, -Dsurefire.skipAfterFailureCount=1.

A partir del 19 de octubre de 2015 version 2.19 has been released.

+0

¡Impresionante! ¡Gracias por regresar para hacer esta respuesta! –

+0

2.19 ha sido relegado –

+0

@Alexey gracias, editado. –

13

Por lo que sé, no, y esto realmente requiere la resolución de SUREFIRE-580. Si desea que esto suceda más rápido, al menos debería votar por el problema y, opcionalmente, enviar un parche;)

+2

¡Ahora está resuelto! –

0

Esto no resuelve la pregunta exactamente, pero la solución que finalmente surgió en mi lugar de trabajo fue usar Atlassian's Clover para ejecutar compilaciones especializadas de pruebas que pertenecen al código modificado.

Tenemos una compilación de Clover que ejecuta las pruebas del código modificado y, a su vez, inicia la compilación de prueba completa.

Esto ha demostrado ser una solución satisfactoria.

1

Algunas maneras de acelerarlo si no es exactamente lo que necesita:

  • Si se trata de un multi acumulación módulo, agregue --fail rápido a la línea de comandos que abandonar después de que el primer módulo .

  • Mire en failsafe para mover largas ejecutando pruebas de integración en una fase diferente del ciclo de vida .

  • Busque en una solución basada en perfiles para pruebas rápidas y lentas - Is there a way to tell surefire to skip tests in a certain package?.

9

Puede haber una adecuada solución , pero depende de sus necesidades y es necesario utilizar un servidor de CI que puede manejar códigos de retorno proceso de JVM.

La idea básica es detener por completo el proceso de JVM de Maven e informar al sistema operativo que el proceso se detuvo inesperadamente. Entonces, un servidor de integración continua como Jenkins/Hudson debería poder verificar si hay un código de salida distinto de cero y hacerle saber que una prueba ha fallado.

El primer paso es asegurarse de que el fuego salga de la JVM en la primera falla de prueba. Usted puede hacer eso con JUnit 4.7 o superior mediante el uso de una costumbre RunListener (ponerlo en 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); 
     } 
} 

Entonces, es necesario configurar esa clase de manera segura va a registrarla con el corredor JUnit 4 .Edite su pom.xml y agregue la propiedad de configuración listener al maven-surefire-plugin. También necesitará configure surefire para no duplicar un nuevo proceso de JVM para ejecutar las pruebas. De lo contrario, continuará con los próximos casos de prueba.

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-surefire-plugin</artifactId> 
    <version>2.10</version> 
    <configuration> 
     <forkMode>never</forkMode> 
     <properties> 
      <property> 
       <name>listener</name> 
       <value>org.example.FailFastListener</value> 
      </property> 
     </properties> 
    </configuration> 
</plugin> 

Si esto no ayuda, intento bifurcar el plugin de proveedor de maven surefire.

Por cierto, las pruebas unitarias, por definición, deben ejecutarse más rápido que 0.1 segundos. Si su construcción realmente lleva tanto tiempo debido a las pruebas unitarias, tendrá que hacer que corran más rápido en el futuro.

+1

excelente solución. Por cierto, parece que la restricción never se puede relajar ejecutando maven con la opción -ff. Después de System.exit() surefire abortará inmediatamente la compilación con un mensaje "goal org.apache.maven.plugins: maven-surefire-plugin: 2.16: test failed: La VM bifurcada terminó sin decir adiós correctamente. VM crash o System. salir llamado? " –

0

Esta no es una respuesta directa a la pregunta, pero también puede ser útil para alimentar la salida de maven a grep, quitar la mayoría de las cosas y ayudarlo a ver dónde están las fallas de la prueba.

De esta manera:

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

que produce la salida (para mi código) así:

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 

mucho más fácil ver dónde está el primer error de la falta.

Cuestiones relacionadas