Pregunta

Estoy usando JUnit 4.4 y Maven y tengo un gran número de pruebas de integración de larga ejecución.

Cuando se trata de paralelizar conjuntos de pruebas, hay algunas soluciones que me permiten ejecutar cada método de prueba en una sola clase de prueba en paralelo. Pero todo esto requiere que cambie las pruebas de una manera u otra.

Realmente creo que sería una solución mucho más limpia ejecutar X clases de prueba diferentes en subprocesos X en paralelo. Tengo cientos de pruebas, por lo que no me importa realmente el subprocesamiento de clases de prueba individuales.

¿Hay alguna manera de hacer esto?

¿Fue útil?

Solución 2

Desde Junit 4.7 ahora es posible ejecutar pruebas en paralelo sin usar TestNG. En realidad, ha sido posible desde 4.6, pero hay una serie de correcciones en 4.7 que lo convertirán en una opción viable. También puede ejecutar pruebas paralelas con Spring, que puede leer sobre aquí

Otros consejos

Usa el plugin maven:

<build>
    <plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.7.1</version>
        <configuration>
            <parallel>classes</parallel>
            <threadCount>5</threadCount>
        </configuration>
    </plugin>
    </plugins>
</build>

Inspirado por el

de JUnit. Corredor ParallelComputer he creado mi propio ParallelSuite y < strong> ParallelParameterized . Al usar estos corredores, se pueden paralizar fácilmente las suites de pruebas y las pruebas parametrizadas.

ParallelSuite.java

public class ParallelSuite extends Suite {

    public ParallelSuite(Class<?> klass, RunnerBuilder builder) throws InitializationError {

        super(klass, builder);

        setScheduler(new RunnerScheduler() {

            private final ExecutorService service = Executors.newFixedThreadPool(4);

            public void schedule(Runnable childStatement) {
                service.submit(childStatement);
            }

            public void finished() {
                try {
                    service.shutdown();
                    service.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
                } catch (InterruptedException e) {
                    e.printStackTrace(System.err);
                }
            }
        });
    }
}

ParallelParameterized.java

public class ParallelParameterized extends Parameterized {

    public ParallelParameterized(Class<?> arg0) throws Throwable {

        super(arg0);

        setScheduler(new RunnerScheduler() {

            private final ExecutorService service = Executors.newFixedThreadPool(8);

            public void schedule(Runnable childStatement) {
                service.submit(childStatement);
            }

            public void finished() {
                try {
                    service.shutdown();
                    service.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
                } catch (InterruptedException e) {
                    e.printStackTrace(System.err);
                }
            }
        });
    }
}

El uso es simple. Simplemente cambie el valor de anotación @RunWith a una de estas clases Paralelas * .

@RunWith(ParallelSuite.class)
@SuiteClasses({ATest.class, BTest.class, CTest.class})
public class ABCSuite {}

tempus-fugit ofrece algo similar, verifique la documentación para más detalles. Se basa en JUnit 4.7 y solo marca su prueba en @RunWith (ConcurrentTestRunner) .

Saludos

TestNG puede hacer eso (este fue mi primer reflejo - entonces vi que ya tienes muchos testcases).

Para JUnit, consulte parallel-junit .

Puede consultar la biblioteca de código abierto, Probar el equilibrador de carga . Hace exactamente lo que pides: ejecuta diferentes clases de prueba en paralelo. Esto se integra en el nivel ant-junit para que no tenga que cambiar sus pruebas de ninguna manera. Soy uno de los autores de la biblioteca.

Además, piense en no ejecutarlos en subprocesos, ya que es posible que necesite un sandbox de nivel de proceso. Por ejemplo, si está alcanzando una base de datos en sus pruebas de integración, no desea que una prueba falle porque otra prueba agregó algunos datos en un subproceso diferente. La mayoría de las veces, las pruebas no se escriben con esto en mente.

Finalmente, ¿cómo hemos resuelto este problema hasta ahora?

Puede ejecutar las pruebas en paralelo utilizando ParallelComputer proporcionada por el propio Junit. Aquí hay un pequeño fragmento de código para comenzar.

Class[] cls = { TestCase1.class, TestCase2.class };
Result result = JUnitCore.runClasses(ParallelComputer.classes(), cls);
List<Failure> failures = result.getFailures();

Esto te ayudará cuando necesites ejecutar pruebas desde el código, ya que no tiene dependencias en Maven ni en ninguna otra herramienta de administración de compilaciones.

Tenga en cuenta que esto ejecutará todos los casos de prueba en paralelo, si tiene dependencias entre los diferentes casos de prueba, puede dar lugar a falsos positivos. NO DEBE realizar pruebas interdependientes de todos modos.

Puedes cambiar tu prueba para que sea TestNg en un minuto (solo necesitas cambiar las importaciones), TestNG es el mejor en pruebas paralelas.

Puedes probar Gridgain que te permite ejecutar Distribuye tus pruebas a través de una cuadrícula de cómputo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top