Frage

Ich bin mit JUnit 4.4 und Maven und ich habe eine große Zahl von langlaufende Integrationstests.

Wenn es darum geht Test zu parallelisieren Suiten gibt es ein paar Lösungen, die mir erlauben, jedes Testverfahren in einer einzigen Test-Klasse parallel laufen zu lassen. Aber alle diese erfordern, dass ich die Tests in der einen oder anderen ändern.

Ich glaube wirklich, es wäre eine viel sauberere Lösung seiner X verschiedene Testklassen in X Threads parallel ausgeführt werden. Ich habe Hunderte von Tests so dass ich nicht wirklich kümmern uns um einzelne Testklassen Threading.

Gibt es eine Möglichkeit, dies zu tun?

War es hilfreich?

Lösung 2

Von junit 4.7 ist es nun möglich, Tests parallel ausführen, ohne TestNG zu verwenden. Eigentlich ist es möglich gewesen, da 4.6, aber es gibt eine Reihe von Korrekturen in 4.7 gemacht werden, dass es eine praktikable Option machen. Sie können auch parallel Tests mit Feder laufen, die Sie über hier

Andere Tipps

Mit Maven Plugin:

<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>

Inspiriert von JUnit experimentellem Parallelcomputer Läufer ich habe meine eigene gebaut ParallelSuite und < strong> ParallelParameterized Läufer. Mit diesen Läufern ein leicht Testsuiten und parametrisiert Tests parallelisieren können.

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

Die Verwendung ist einfach. Ändern Sie einfach @RunWith Anmerkungen Wert auf eine dieser Parallel * Klassen.

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

tempus fugit- bietet etwas ähnliches, die Dokumentation für Details überprüfen. Es stützt sich auf JUnit 4.7 und einfach markiert Ihren Test @RunWith(ConcurrentTestRunner).

Prost

TestNG dass tun können (dies war mein erster Reflex - dann sah ich Sie bereits eine Menge Testfälle haben).

Für JUnit, schauen Sie sich parallel junit .

Sie können die Open-Source-Bibliothek überprüfen - Test Load Balancer . Es tut genau das, was man sich wünschen - verschiedene Testklassen parallel laufen. Diese integriert in die Ameisen junit Ebene, so dass Sie müssen in irgendeiner Weise Ihre Tests nicht ändern. Ich bin einer der Autoren der Bibliothek.

Auch denken Sie nicht, sie in Threads laufen, wie Sie auf Prozessebene Sandbox benötigen. wenn Sie eine DB in Ihren Integrationstests Zum Beispiel schlagen, Sie wollen nicht zu einem Test fehl, da ein weiterer Test einig Daten in einem anderen Thread hinzugefügt. Die meisten der Zeit, Tests sind nicht in diesem Sinne geschrieben.

Und schließlich, wie dieses Problem bisher gelöst?

Sie können die Tests parallel mit Parallelcomputer von JUnit selbst vorgesehen laufen. Hier ist ein kleiner Ausschnitt Sie, um loszulegen.

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

Dies wird helfen, wenn Sie Tests von Code ausführen müssen, da es keine Abhängigkeiten von Maven oder anderen Build-Management-Tool hat.

Bitte beachten Sie, dass diese alle Testfälle parallel laufen, wenn Sie irgendwelche Abhängigkeiten zwischen den Fällen unterschiedlichem Tests haben es in Fehlalarme führen könnte. Sie sollten nicht ohnehin voneinander abhängig Tests haben.

Sie Ihren Test ändern können testng Test in einer Minute (Sie müssen nur ändern Importe), TestNG ist die beste in Parallel-Test zu sein.

Sie könnten versuchen, Gridgain, mit der Sie laufen verteilen Sie Ihre Tests über einen Computer-Grid.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top