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 {
