2010-02-18 10 views
16

Me pregunto si el plugin Maven surefire ejecuta pruebas de subprocesos múltiples de forma predeterminada (y si es así se puede controlar el número de subprocesos?) O si ejecuta pruebas de las clases de prueba en orden aleatorio u orden predecible, o si la orden puede dictarse de alguna manera.¿El plugin de Maven Surefire ejecuta pruebas usando múltiples hilos?

No he verificado esto todavía (lo haré mañana solo buscando orientación y verificación en este punto), pero parece que mis diversas pruebas JUnit están haciendo que las pruebas se ejecuten en algunos entremezclado orden. Lo que hace que sea un verdadero dolor orquestar la creación de los recursos de prueba (que son bastante fuertes en mi caso).

Probablemente sea un problema clásico que ejecute mi suite con el corredor Eclipse JUnit y todo funciona muy lineal y funciona bien. Voy a la línea de cmd de Maven y las cosas parecen pisar una sobre la otra.

Respuesta

13

Por defecto, Maven ejecuta sus pruebas en un proceso separado ("bifurcado"), nada más (esto se puede controlar utilizando el parámetro opcional forkMode).

Si está utilizando TestNG o Junit 4.7+ (ya SUREFIRE-555 ), es posible realizar pruebas en paralelo (ver el parallel y los threadCount parámetros opcionales), pero eso no es un defecto.

Ahora bien, aunque no estoy seguro de si el plugin de éxito seguro se comporta igual que JUnit, es posible conseguir un poco de control creando manualmente un TestSuite y especificar el orden en que se ejecutan las pruebas:

TestSuite suite= new TestSuite(); 
suite.addTest(new MathTest("testAdd")); 
suite.addTest(new MathTest("testDivideByZero")); 

Sin embargo, se recomienda encarecidamente que nunca dependa del orden de ejecución de la prueba, las pruebas unitarias realmente deberían ser independientes.

P.S .: Por si acaso, también existe esta solicitud SUREFIRE-321 (para ejecutar las pruebas en orden alfabético) que es posible que desee votar.

+0

Hola, consciente de evitar las pruebas interactivas, tratar de llegar ... Votado por ambas cuestiones. Parece que 555 ahora es parte de la versión 2.5 http://repo1.maven.org/maven2/org/apache/maven/plugins/maven-surefire-plugin/2.5/. – harschware

+0

utilice el plugin surefire versión 2.4.2 o superior en caso de que no quiera enfrentar problemas relacionados con OOM –

3

Antes que nada, las pruebas de su unidad deben ser independientes entre sí. Esto se debe a que el orden de ejecución no está garantizado incluso por JUnit, por lo que cada prueba debe configurar y desmantelar su contexto (también conocido como accesorio de prueba) independientemente de lo que ocurra antes o después.

El orden de ejecución definitivamente no es al azar, sin embargo, en JUnit que tiende a ser el mismo (yo supongo orden alfabético), pero no debería acumulación en él - se puede cambiar en cualquier momento, y por lo visto en el éxito seguro de la el orden es diferente

Aquí hay un buen enlace sobre por qué interacting tests no son una buena idea.

+0

Hola, consciente de evitar pruebas interactivas, tratando para llegar ... gracias por el consejo y el enlace. – harschware

2

JUnit ejecuta las pruebas en el orden en que aparecen en el archivo .java (no alfabéticamente). Maven-surefire los ejecuta en un orden diferente, pero no predecible (por lo que puedo ver).

Lo ideal sería que las pruebas fueran independientes entre sí, pero los datos únicos y el contexto estático pueden complicar las cosas. Una forma útil de obtener nuevos contextos estáticos entre ejecuciones de TestCase (pero no pruebas individuales) es establecer la variable forkMode en su pom.xml.

<forkMode> siempre </forkMode >

0

He encontrado que si está utilizando la opción -T en su comando experto, éxito seguro a continuación, se bifurcará en forkCount * <specified number of threads by the -T option> número de procesos concurrentes.

para hacerlos todos corren en un solo proceso a pesar de tener múltiples hilos especificados por -T, puede forzar forkCount ser 0 añadiendo la opción -Dsurefire.forkCount = 0

Cuestiones relacionadas