This is an automated email from the ASF dual-hosted git repository.

tibordigana pushed a commit to branch SUREFIRE-1725
in repository https://gitbox.apache.org/repos/asf/maven-surefire.git

commit acf7733a798359c6570a194fd21951eae9b0d7ab
Author: tibordigana <[email protected]>
AuthorDate: Sat Jan 4 06:17:07 2020 +0100

    [SUREFIRE-1725] Surefire in JUnit Vintage mode distributes tests very 
unevenly between forks, causing poor parallelism
---
 .../junitplatform/JUnitPlatformProvider.java       | 36 ++++++++++++++-----
 .../surefire/junitplatform/RunListenerAdapter.java |  1 -
 .../junitplatform/JUnitPlatformProviderTest.java   | 41 ++++++++++++++++++++++
 3 files changed, 68 insertions(+), 10 deletions(-)

diff --git 
a/surefire-providers/surefire-junit-platform/src/main/java/org/apache/maven/surefire/junitplatform/JUnitPlatformProvider.java
 
b/surefire-providers/surefire-junit-platform/src/main/java/org/apache/maven/surefire/junitplatform/JUnitPlatformProvider.java
index 373a4ca..db85221 100644
--- 
a/surefire-providers/surefire-junit-platform/src/main/java/org/apache/maven/surefire/junitplatform/JUnitPlatformProvider.java
+++ 
b/surefire-providers/surefire-junit-platform/src/main/java/org/apache/maven/surefire/junitplatform/JUnitPlatformProvider.java
@@ -58,6 +58,7 @@ import 
org.apache.maven.surefire.testset.TestSetFailedException;
 import org.apache.maven.surefire.util.ScanResult;
 import org.apache.maven.surefire.util.TestsToRun;
 import org.junit.platform.commons.util.StringUtils;
+import org.junit.platform.engine.DiscoverySelector;
 import org.junit.platform.engine.Filter;
 import org.junit.platform.launcher.Launcher;
 import org.junit.platform.launcher.LauncherDiscoveryRequest;
@@ -149,9 +150,8 @@ public class JUnitPlatformProvider
 
     private void invokeAllTests( TestsToRun testsToRun, RunListener 
runListener )
     {
-        LauncherDiscoveryRequest discoveryRequest = 
buildLauncherDiscoveryRequest( testsToRun );
         RunListenerAdapter adapter = new RunListenerAdapter( runListener );
-        launcher.execute( discoveryRequest, adapter );
+        execute( testsToRun, adapter );
         // Rerun failing tests if requested
         int count = parameters.getTestRequest().getRerunFailingTestsCount();
         if ( count > 0 && adapter.hasFailingTests() )
@@ -159,7 +159,7 @@ public class JUnitPlatformProvider
             for ( int i = 0; i < count; i++ )
             {
                 // Replace the "discoveryRequest" so that it only specifies 
the failing tests
-                discoveryRequest = 
buildLauncherDiscoveryRequestForRerunFailures( adapter );
+                LauncherDiscoveryRequest discoveryRequest = 
buildLauncherDiscoveryRequestForRerunFailures( adapter );
                 // Reset adapter's recorded failures and invoke the failed 
tests again
                 adapter.reset();
                 launcher.execute( discoveryRequest, adapter );
@@ -172,15 +172,33 @@ public class JUnitPlatformProvider
         }
     }
 
-    private LauncherDiscoveryRequest buildLauncherDiscoveryRequest( TestsToRun 
testsToRun )
+    private void execute( TestsToRun testsToRun, RunListenerAdapter adapter )
     {
-        LauncherDiscoveryRequestBuilder builder =
-                        request().filters( filters ).configurationParameters( 
configurationParameters );
-        for ( Class<?> testClass : testsToRun )
+        if ( testsToRun.allowEagerReading() )
         {
-            builder.selectors( selectClass( testClass.getName() ) );
+            List<DiscoverySelector> selectors = new ArrayList<>();
+            testsToRun.iterator()
+                .forEachRemaining( c -> selectors.add( selectClass( 
c.getName() )  ) );
+
+            LauncherDiscoveryRequestBuilder builder = request()
+                .filters( filters )
+                .configurationParameters( configurationParameters )
+                .selectors( selectors );
+
+            launcher.execute( builder.build(), adapter );
+        }
+        else
+        {
+            testsToRun.iterator()
+                .forEachRemaining( c ->
+                {
+                    LauncherDiscoveryRequestBuilder builder = request()
+                        .filters( filters )
+                        .configurationParameters( configurationParameters )
+                        .selectors( selectClass( c.getName() ) );
+                    launcher.execute( builder.build(), adapter );
+                } );
         }
-        return builder.build();
     }
 
     private LauncherDiscoveryRequest 
buildLauncherDiscoveryRequestForRerunFailures( RunListenerAdapter adapter )
diff --git 
a/surefire-providers/surefire-junit-platform/src/main/java/org/apache/maven/surefire/junitplatform/RunListenerAdapter.java
 
b/surefire-providers/surefire-junit-platform/src/main/java/org/apache/maven/surefire/junitplatform/RunListenerAdapter.java
index bdcca6b..f8fd3bc 100644
--- 
a/surefire-providers/surefire-junit-platform/src/main/java/org/apache/maven/surefire/junitplatform/RunListenerAdapter.java
+++ 
b/surefire-providers/surefire-junit-platform/src/main/java/org/apache/maven/surefire/junitplatform/RunListenerAdapter.java
@@ -64,7 +64,6 @@ final class RunListenerAdapter
     public void testPlanExecutionStarted( TestPlan testPlan )
     {
         this.testPlan = testPlan;
-        failures.clear();
     }
 
     @Override
diff --git 
a/surefire-providers/surefire-junit-platform/src/test/java/org/apache/maven/surefire/junitplatform/JUnitPlatformProviderTest.java
 
b/surefire-providers/surefire-junit-platform/src/test/java/org/apache/maven/surefire/junitplatform/JUnitPlatformProviderTest.java
index 0af2834..0ca5478 100644
--- 
a/surefire-providers/surefire-junit-platform/src/test/java/org/apache/maven/surefire/junitplatform/JUnitPlatformProviderTest.java
+++ 
b/surefire-providers/surefire-junit-platform/src/test/java/org/apache/maven/surefire/junitplatform/JUnitPlatformProviderTest.java
@@ -202,6 +202,28 @@ public class JUnitPlatformProviderTest
     }
 
     @Test
+    public void singleTestClassIsInvokedLazily()
+        throws Exception
+    {
+        Launcher launcher = LauncherFactory.create();
+        JUnitPlatformProvider provider = new JUnitPlatformProvider( 
providerParametersMock(), launcher );
+
+        TestPlanSummaryListener executionListener = new 
TestPlanSummaryListener();
+        launcher.registerTestExecutionListeners( executionListener );
+
+        invokeProvider( provider, newTestsToRunLazily( TestClass1.class ) );
+
+        assertThat( executionListener.summaries ).hasSize( 1 );
+        TestExecutionSummary summary = executionListener.summaries.get( 0 );
+        assertEquals( TestClass1.TESTS_FOUND, summary.getTestsFoundCount() );
+        assertEquals( TestClass1.TESTS_STARTED, summary.getTestsStartedCount() 
);
+        assertEquals( TestClass1.TESTS_SKIPPED, summary.getTestsSkippedCount() 
);
+        assertEquals( TestClass1.TESTS_SUCCEEDED, 
summary.getTestsSucceededCount() );
+        assertEquals( TestClass1.TESTS_ABORTED, summary.getTestsAbortedCount() 
);
+        assertEquals( TestClass1.TESTS_FAILED, summary.getTestsFailedCount() );
+    }
+
+    @Test
     public void failingTestCaseAfterRerun()
             throws Exception
     {
@@ -820,6 +842,25 @@ public class JUnitPlatformProviderTest
         return new TestsToRun( new LinkedHashSet<>( classesList ) );
     }
 
+    private static TestsToRun newTestsToRunLazily( Class<?>... testClasses )
+    {
+        class LazyTestsToRunFake extends TestsToRun
+        {
+            LazyTestsToRunFake( Set<Class<?>> locatedClasses )
+            {
+                super( locatedClasses );
+            }
+
+            @Override
+            public boolean allowEagerReading()
+            {
+                return false;
+            }
+        }
+        List<Class<?>> classesList = Arrays.asList( testClasses );
+        return new LazyTestsToRunFake( new LinkedHashSet<>( classesList ) );
+    }
+
     private static class TestPlanSummaryListener
                     extends SummaryGeneratingListener
     {

Reply via email to