5
votes

Exécuter des tests JUnit4 en parallèle à l'aide de gradle

Je voudrais exécuter des tests en parallèle avec Gradle. Mes expériences me montrent que Gradle exécute des tests en parallèle au niveau de la classe. J'ai besoin qu'ils soient exécutés au niveau de la méthode.

Étant donné deux classes de test comme celle-ci:

./gradlew clean test

> Task :test

se.thinkcode.ManyTest > should_sleep_2_seconds STANDARD_OUT
    Start 2 seconds

se.thinkcode.OneTest > should_sleep_4_seconds STANDARD_OUT
    Start 4 seconds

se.thinkcode.ManyTest > should_sleep_2_seconds STANDARD_OUT
    Done 2 seconds

se.thinkcode.ManyTest > should_sleep_1_seconds STANDARD_OUT
    Start 1 seconds
    Done 1 seconds

se.thinkcode.OneTest > should_sleep_4_seconds STANDARD_OUT
    Done 4 seconds

BUILD SUCCESSFUL in 5s
3 actionable tasks: 3 executed
plugins {
    id 'java'
}

sourceCompatibility = '1.8'
targetCompatibility = '1.8'

dependencies {
    testCompile 'junit:junit:4.12'
}

test {
    testLogging.showStandardStreams = true
    maxParallelForks = 3
}

repositories {
    mavenCentral()
}

Et un script de construction comme celui-ci:

public class ManyTest {

    @Test
    public void should_sleep_1_seconds() throws Exception {
        System.out.println("Start 1 seconds");
        Thread.sleep(1000);
        System.out.println("Done 1 seconds");
    }

    @Test
    public void should_sleep_2_seconds() throws Exception {
        System.out.println("Start 2 seconds");
        Thread.sleep(2000);
        System.out.println("Done 2 seconds");
    }
}

Je peux obtenir ce résultat:

public class OneTest {
    @Test
    public void should_sleep_4_seconds() throws Exception {
        System.out.println("Start 4 seconds");
        Thread.sleep(4000);
        System.out.println("Done 4 seconds");
    }
}

Cela me dit qu'il y a du parallélisme mais que ce n'est que sur la classe niveau, pas au niveau de la méthode.

Existe-t-il un moyen natif de faire exécuter Gradle dans un thread par méthode de test?


1 commentaires

Comme les réponses l'indiquent, ce que je veux n'est pas pris en charge par Gradle pour le moment.


3 Réponses :


1
votes

Il n'est pas possible d'utiliser Gradles JUnit 4 runner pour exécuter des tests en parallèle pour autre chose que des classes.

Je ne peux pas confirmer que cela fonctionne mais vous pouvez essayer la plateforme JUnit + JUnit Vintage de JUnit 5. un aperçu des JUnit 5 starters pour voir comment configurer cela.

dependencies {
    def junit4Version = '4.12'
    def junit5Version = '5.3.2'
    implementation(enforcedPlatform("org.junit:junit-bom:${junit5Version}")) {
        because 'enforce matching Platform, Jupiter, and Vintage versions'
    }

    // JUnit Jupiter
    testImplementation('org.junit.jupiter:junit-jupiter-api')
    testImplementation('org.junit.jupiter:junit-jupiter-params')
    testRuntimeOnly('org.junit.jupiter:junit-jupiter-engine') {
        because 'allows JUnit 5 (read Jupiter) tests to run'
    }

    // JUnit Vintage
    testImplementation("junit:junit:${junit4Version}")
    testRuntimeOnly('org.junit.vintage:junit-vintage-engine') {
        because 'allows JUnit 3 and JUnit 4 tests to run'
    }
}

Vous pouvez ensuite ajouter junit.jupiter.execution.parallel.enabled = true code> à junit-platform.properties pour activer l'exécution parallèle. Consultez le JUnit 5 User Guide - Parallel Execution a>.


1 commentaires

Je peux confirmer que cela ne fonctionne PAS pour les tests vintage (Junit4).



0
votes

Malheureusement, gradle ne prend toujours pas en charge cette fonctionnalité.

P.S. la quantité de maxParallelForks doit être déterminée dans de cette façon :

maxParallelForks = Runtime.runtime.availableProcessors().intdiv(2) ?: 1


0 commentaires

1
votes

1 commentaires

Comment implémenter le plugin Maven SureFire avec Gradle?