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.