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?
3 Réponses :
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>.
Je peux confirmer que cela ne fonctionne PAS pour les tests vintage (Junit4).
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
Ce n'est pas possible a> (encore?) dans Gradle. Le niveau le plus fin est classes où Le plugin Maven Surefire peut descendre au niveau méthodes
Comment implémenter le plugin Maven SureFire avec Gradle?
Comme les réponses l'indiquent, ce que je veux n'est pas pris en charge par Gradle pour le moment.