unit testing - ¿El complemento seguro de Maven ejecuta pruebas utilizando múltiples subprocesos?
unit-testing maven-2 (4)
Me pregunto si el complemento Maven surefire ejecuta pruebas de múltiples subprocesos de forma predeterminada (y, de ser así, ¿se puede controlar el número de subprocesos?) O si ejecuta pruebas de las clases de Prueba en un orden aleatorio o predecible, o si El orden puede ser dictado por algún medio.
No he verificado esto todavía (lo haré mañana solo buscando información de orientación y verificación en este punto), pero parece que mis diversas clases de Pruebas de JUnit están haciendo que las pruebas se ejecuten en algún orden entremezclado. Lo que hace que sea un verdadero dolor organizar la creación de los recursos de prueba (que son bastante fuertes en mi caso).
Probablemente sea un problema clásico. Ejecuto 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 estar pasando una sobre la otra.
Descubrí que si está utilizando la opción -T en su comando maven, Surefire luego se forkCount * <specified number of threads by the -T option>
en forkCount * <specified number of threads by the -T option>
número de forkCount * <specified number of threads by the -T option>
de procesos concurrentes.
Para hacer que todos se ejecuten en un proceso a pesar de tener múltiples subprocesos especificados por -T, puede forzar que forkCount sea 0 agregando la opción -Dsurefire.forkCount = 0
En primer lugar, sus pruebas de unidad deben ser independientes entre sí . Esto se debe a que JUnit no garantiza el orden de ejecución, por lo que cada prueba debe configurar y eliminar su contexto (también conocido como dispositivo de prueba) independientemente de lo que ocurra antes o después.
El orden de ejecución definitivamente no es aleatorio, sin embargo, en JUnit tiende a ser el mismo (yo diría que el orden alfabético), pero no debe basarse en él, puede cambiar en cualquier momento, y al parecer en Surefire el orden es diferente.
Aquí hay un buen enlace sobre por qué las pruebas interactivas no son una buena idea.
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 predeciblemente (por lo que puedo decir).
Idealmente, las pruebas serían independientes entre sí, pero los singletons y el contexto estático pueden complicar las cosas. Una forma útil de obtener nuevos contextos estáticos entre ejecuciones de TestCase independientes (pero no pruebas individuales) es establecer la variable forkMode en su pom.xml.
<forkMode> siempre </forkMode>
Por defecto, Maven ejecuta sus pruebas en un proceso separado ("bifurcado"), nada más (esto puede controlarse usando el parámetro opcional forkMode
).
Si está utilizando TestNG o Junit 4.7+ (desde SUREFIRE-555 ), es posible ejecutar pruebas en paralelo (vea los parámetros opcionales de parallel
y threadCount
) pero eso no es un valor predeterminado.
Ahora, aunque no estoy seguro de si el complemento surefire se comporta de la misma manera que JUnit, es posible obtener algo de control al crear 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 de la orden de ejecución de la prueba, las pruebas unitarias deben ser realmente independientes.
PD: Por si acaso, también existe esta solicitud de SUREFIRE-321 (para ejecutar las pruebas en orden alfabético) por la que podría querer votar.