112 votes

Tests junit en cours d’exécution en parallèle dans une build Maven ?

Je suis en utilisant JUnit 4.4 et Maven et j'ai un grand nombre de long-exécution des tests d'intégration.

Quand il s'agit de la parallélisation des suites de test il y a quelques solutions qui me permettent de courir chaque méthode de test en un seul test de la classe en parallèle. Mais toutes requièrent que je me change les tests d'une manière ou d'une autre.

Je pense vraiment qu'il serait beaucoup plus propre solution pour exécuter X différentes classes de test dans X threads en parallèle. J'ai des centaines de tests, donc je ne pas vraiment se soucier de filetage test individuel-classes.

Est-il possible de faire cela?

76voto

Oleksandr Points 301

Utiliser le plugin maven :

42voto

krosenvold Points 35979

De junit 4.7, il est maintenant possible d’exécuter des tests en parallèle sans utiliser TestNG. En fait, il a été possible depuis 4.6, mais il y a un certain nombre de bugs en 4.7 qui en font une option viable. Vous pouvez également exécuter des tests parallèles avec le printemps, que vous pouvez lire ici

10voto

mustafau Points 65

Inspiré par JUnit expérimentale ParallelComputer coureur que j'ai construit mon propre ParallelSuite et ParallelParameterized coureurs. L'utilisation de ces coureurs, on peut facilement paralléliser des suites de tests et tests paramétrés.

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);
                }
            }
        });
    }
}

L'utilisation est simple. Il suffit de changer annotation@RunWith annotations de la valeur à l'un de ces Parallèles* les classes.

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

5voto

Toby Points 1833

Tempus-fugit offre quelque chose de similaire, consultez la documentation pour plus de détails. Il s’appuie sur JUnit 4,7 et vous marquez simplement votre test à @RunWith(ConcurrentTestRunner).

à votre santé

2voto

philant Points 17345

TestNG peut le faire (ce fut mon premier réflexe - puis j’ai vu que vous rencontrez déjà un grand nombre de tests unitaires).

Pour JUnit, regardez parallèle-junit.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X