Domanda

Sto usando JUnit 4.4 e Maven e ho un gran numero di test di integrazione di lunga durata.

Quando si tratta di parallelizzare le suite di test ci sono alcune soluzioni che mi consentono di eseguire in parallelo ciascun metodo di test in una singola classe di test. Ma tutto ciò richiede che io cambi i test in un modo o nell'altro.

Penso davvero che sarebbe una soluzione molto più pulita eseguire X diverse classi di test in X thread in parallelo. Ho centinaia di test, quindi non mi interessa davvero il threading delle singole classi di test.

C'è un modo per farlo?

È stato utile?

Soluzione 2

Da junit 4.7 è ora possibile eseguire test in parallelo senza usare TestNG. In realtà è stato possibile dal 4.6, ma ci sono un certo numero di correzioni in 4.7 che lo renderanno un'opzione praticabile. Puoi anche eseguire test paralleli con spring, che puoi leggere su qui

Altri suggerimenti

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

Ispirato all'esperimento ParallelComputer corridore Ho creato il mio ParallelSuite e < strong> Corridori paralleli parametrizzati . Utilizzando questi corridori si possono facilmente parallelizzare le suite di test e i test con parametri.

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'utilizzo è semplice. Cambia il @RunWith valore delle annotazioni in una di queste Parallele * .

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

tempus-fugit offre qualcosa di simile, controlla i documenti per i dettagli. Si basa su JUnit 4.7 e basta contrassegnare il test su @RunWith (ConcurrentTestRunner) .

Saluti

TestNG può farlo (questo è stato il mio primo riflesso - poi ho visto che hai già un sacco di testcase).

Per JUnit, guarda parallel-junit .

Puoi consultare la libreria open source - Test Load Balancer . Fa esattamente quello che chiedi - esegui diverse classi di test in parallelo. Questo si integra a livello di ant-junit in modo da non dover comunque modificare i test. Sono uno degli autori della biblioteca.

Inoltre, pensa a non eseguirli nei thread poiché potrebbe essere necessario un sandbox a livello di processo. Ad esempio, se si sta colpendo un DB nei test di integrazione, non si desidera che un test fallisca perché un altro test ha aggiunto alcuni dati in un thread diverso. Il più delle volte, i test non sono scritti tenendo presente questo aspetto.

Infine, come hanno risolto questo problema fino ad ora?

Puoi eseguire i test in parallelo usando ParallelComputer fornito da Junit stesso. Ecco un piccolo frammento per iniziare.

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

Ciò sarà utile quando è necessario eseguire test dal codice in quanto non ha dipendenze da Maven o altri strumenti di gestione della build.

Si noti che questo eseguirà tutti i casi di test in parallelo, se si hanno dipendenze tra diversi casi di test, si potrebbero verificare falsi positivi. NON DOVREBBE comunque avere test interdipendenti.

Puoi modificare il tuo test in TestNg in un minuto (devi solo cambiare le importazioni), TestNG è il migliore nei test in parallelo.

Potresti provare Gridgain che ti permette di correre distribuire i test su una griglia di calcolo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top