You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by ti...@apache.org on 2019/11/12 02:52:36 UTC

[maven-surefire] branch master updated: [SUREFIRE-1716] JUnit5 Parameterized tests and re-run should see unique test runs with different parameters

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 0c0d902  [SUREFIRE-1716] JUnit5 Parameterized tests and re-run should see unique test runs with different parameters
0c0d902 is described below

commit 0c0d902dec9b21e547a40762da59ac0f90fec934
Author: tibordigana <ti...@apache.org>
AuthorDate: Tue Nov 12 03:52:22 2019 +0100

    [SUREFIRE-1716] JUnit5 Parameterized tests and re-run should see unique test runs with different parameters
---
 .../apache/maven/surefire/its/JUnitPlatformIT.java | 29 +++++++-
 .../surefire/junitplatform/RunListenerAdapter.java | 20 ++++--
 .../junitplatform/JUnitPlatformProviderTest.java   | 81 +++++++++++++++++++---
 .../junitplatform/RunListenerAdapterTest.java      | 10 +--
 4 files changed, 119 insertions(+), 21 deletions(-)

diff --git a/surefire-its/src/test/java/org/apache/maven/surefire/its/JUnitPlatformIT.java b/surefire-its/src/test/java/org/apache/maven/surefire/its/JUnitPlatformIT.java
index 5a26e0f..765d1a7 100644
--- a/surefire-its/src/test/java/org/apache/maven/surefire/its/JUnitPlatformIT.java
+++ b/surefire-its/src/test/java/org/apache/maven/surefire/its/JUnitPlatformIT.java
@@ -120,6 +120,19 @@ public class JUnitPlatformIT
                 .assertContainsText( "testcase name=\"73$71 ✔\" classname=\"&lt;&lt; ✨ &gt;&gt;\"" )
                 .assertContainsText( "testcase name=\"73$72 ✔\" classname=\"&lt;&lt; ✨ &gt;&gt;\"" )
                 .assertContainsText( XML_TESTSUITE_FRAGMENT );
+
+
+        validator.getSurefireReportsFile( "TEST-junitplatformenginejupiter.BasicJupiterTest.xml", UTF_8 )
+                .assertContainsText( "<testcase name=\"test(TestInfo)\" "
+                        + "classname=\"junitplatformenginejupiter.BasicJupiterTest\"" )
+                .assertContainsText( "<testcase name=\"0 + 1 = 1\" "
+                        + "classname=\"junitplatformenginejupiter.BasicJupiterTest\"" )
+                .assertContainsText( "<testcase name=\"1 + 2 = 3\" "
+                        + "classname=\"junitplatformenginejupiter.BasicJupiterTest\"" )
+                .assertContainsText( "<testcase name=\"49 + 51 = 100\" "
+                        + "classname=\"junitplatformenginejupiter.BasicJupiterTest\"" )
+                .assertContainsText( "<testcase name=\"1 + 100 = 101\" "
+                        + "classname=\"junitplatformenginejupiter.BasicJupiterTest\"" );
     }
 
     @Test
@@ -145,11 +158,25 @@ public class JUnitPlatformIT
     @Test
     public void testMultipleEngines()
     {
-        unpack( "junit-platform-multiple-engines", "-" + junit5Version + "-" + jqwikVersion )
+        OutputValidator validator =
+                unpack( "junit-platform-multiple-engines", "-" + junit5Version + "-" + jqwikVersion )
                 .sysProp( "junit5.version", junit5Version )
                 .sysProp( "jqwik.version", jqwikVersion )
                 .executeTest()
                 .verifyErrorFree( 7 );
+
+
+        validator.getSurefireReportsFile( "TEST-junitplatformenginejupiter.BasicJupiterTest.xml", UTF_8 )
+                .assertContainsText( "<testcase name=\"test(TestInfo)\" "
+                        + "classname=\"junitplatformenginejupiter.BasicJupiterTest\"" )
+                .assertContainsText( "<testcase name=\"add(int, int, int)[1]\" "
+                        + "classname=\"junitplatformenginejupiter.BasicJupiterTest\"" )
+                .assertContainsText( "<testcase name=\"add(int, int, int)[2]\" "
+                        + "classname=\"junitplatformenginejupiter.BasicJupiterTest\"" )
+                .assertContainsText( "<testcase name=\"add(int, int, int)[3]\" "
+                        + "classname=\"junitplatformenginejupiter.BasicJupiterTest\"" )
+                .assertContainsText( "<testcase name=\"add(int, int, int)[4]\" "
+                        + "classname=\"junitplatformenginejupiter.BasicJupiterTest\"" );
     }
 
     @Test
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 5e61a90..5e1e631 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
@@ -20,6 +20,7 @@ package org.apache.maven.surefire.junitplatform;
  */
 
 import static java.util.Collections.emptyMap;
+import static java.util.stream.Collectors.joining;
 import static org.apache.maven.surefire.util.internal.ObjectUtils.systemProps;
 
 import java.util.Map;
@@ -27,6 +28,7 @@ import java.util.Objects;
 import java.util.Optional;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
+import java.util.regex.Pattern;
 
 import org.apache.maven.surefire.report.PojoStackTraceWriter;
 import org.apache.maven.surefire.report.RunListener;
@@ -46,6 +48,8 @@ import org.junit.platform.launcher.TestPlan;
 final class RunListenerAdapter
     implements TestExecutionListener
 {
+    private static final Pattern COMMA_PATTERN = Pattern.compile( "," );
+
     private final ConcurrentMap<TestIdentifier, Long> testStartTime = new ConcurrentHashMap<>();
     private final ConcurrentMap<TestIdentifier, TestExecutionResult> failures = new ConcurrentHashMap<>();
     private final RunListener runListener;
@@ -236,15 +240,23 @@ final class RunListenerAdapter
             String realClassName = methodSource.getClassName();
 
             String[] source = testPlan.getParent( testIdentifier )
-                    .map( i -> toClassMethodName( i ) )
+                    .map( this::toClassMethodName )
                     .map( s -> new String[] { s[0], s[1] } )
                     .orElse( new String[] { realClassName, realClassName } );
 
+            String simpleClassNames = COMMA_PATTERN.splitAsStream( methodSource.getMethodParameterTypes() )
+                    .map( s -> s.substring( 1 + s.lastIndexOf( '.' ) ) )
+                    .collect( joining( "," ) );
+
+            boolean hasParams = !simpleClassNames.isEmpty();
             String methodName = methodSource.getMethodName();
-            boolean useMethod = display.equals( methodName ) || display.equals( methodName + "()" );
-            String resolvedMethodName = useMethod ? methodName : display;
+            String methodSign = methodName + '(' + simpleClassNames + ')';
+            String description = testIdentifier.getLegacyReportingName();
+            boolean useDesc = description.startsWith( methodSign );
+            String methodDesc = hasParams ? ( useDesc ? description : methodSign ) : methodName;
+            String methodDisp = methodSign.equals( display ) ? methodDesc : display;
 
-            return new String[] {source[0], source[1], methodName, resolvedMethodName};
+            return new String[] {source[0], source[1], methodDesc, methodDisp};
         }
         else if ( testSource.filter( ClassSource.class::isInstance ).isPresent() )
         {
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 23e7ea7..16a7343 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
@@ -26,6 +26,7 @@ import static org.apache.maven.surefire.booter.ProviderParameterNames.TESTNG_EXC
 import static org.apache.maven.surefire.booter.ProviderParameterNames.TESTNG_GROUPS_PROP;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.junit.jupiter.api.Assumptions.assumeFalse;
@@ -64,6 +65,7 @@ import org.apache.maven.surefire.util.TestsToRun;
 import org.fest.assertions.Assertions;
 import org.junit.Test;
 import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.DisplayName;
 import org.junit.platform.launcher.Launcher;
 import org.junit.platform.launcher.TestIdentifier;
 import org.junit.platform.launcher.TestPlan;
@@ -297,6 +299,32 @@ public class JUnitPlatformProviderTest
     }
 
     @Test
+    public void runDisplayNameTest() throws Exception
+    {
+        Launcher launcher = LauncherFactory.create();
+        ProviderParameters parameters = providerParametersMock();
+        JUnitPlatformProvider provider = new JUnitPlatformProvider( parameters, launcher );
+
+        RunListener listener = mock( RunListener.class );
+        ArgumentCaptor<ReportEntry> entryCaptor = ArgumentCaptor.forClass( ReportEntry.class );
+        RunListenerAdapter adapter = new RunListenerAdapter( listener );
+
+        launcher.registerTestExecutionListeners( adapter );
+
+        invokeProvider( provider, DisplayNameTest.class );
+
+        verify( listener, times( 1 ) ).testStarting( entryCaptor.capture() );
+        List<ReportEntry> reportEntries = entryCaptor.getAllValues();
+
+        assertEquals( 1, reportEntries.size() );
+
+        assertEquals( DisplayNameTest.class.getName(), reportEntries.get( 0 ).getSourceName() );
+        assertEquals( "<< ✨ >>", reportEntries.get( 0 ).getSourceText() );
+        assertEquals( "test1", reportEntries.get( 0 ).getName() );
+        assertEquals( "73$71 ✔", reportEntries.get( 0 ).getNameText() );
+    }
+
+    @Test
     public void rerunParameterized()
             throws Exception
     {
@@ -309,12 +337,42 @@ public class JUnitPlatformProviderTest
                         "forkCount = 1\nreuseForks = true" ) );
 
         JUnitPlatformProvider provider = new JUnitPlatformProvider( parameters, launcher );
+
         TestPlanSummaryListener executionListener = new TestPlanSummaryListener();
-        launcher.registerTestExecutionListeners( executionListener );
+
+        RunListener listener = mock( RunListener.class );
+        ArgumentCaptor<ReportEntry> entryCaptor = ArgumentCaptor.forClass( ReportEntry.class );
+        RunListenerAdapter adapter = new RunListenerAdapter( listener );
+
+        launcher.registerTestExecutionListeners( executionListener, adapter );
 
         invokeProvider( provider, TestClass7.class );
 
         assertThat( executionListener.summaries ).hasSize( 3 );
+
+        verify( listener, times( 4 ) ).testStarting( entryCaptor.capture() );
+        List<ReportEntry> reportEntries = entryCaptor.getAllValues();
+
+        assertEquals( TestClass7.class.getName(), reportEntries.get( 0 ).getSourceName() );
+        assertNull( reportEntries.get( 0 ).getSourceText() );
+        assertEquals( "testParameterizedTestCases(String, boolean)[1]", reportEntries.get( 0 ).getName() );
+        assertEquals( "[1] Always pass, true", reportEntries.get( 0 ).getNameText() );
+
+        assertEquals( TestClass7.class.getName(), reportEntries.get( 1 ).getSourceName() );
+        assertNull( reportEntries.get( 1 ).getSourceText() );
+        assertEquals( "testParameterizedTestCases(String, boolean)[2]", reportEntries.get( 1 ).getName() );
+        assertEquals( "[2] Always fail, false", reportEntries.get( 1 ).getNameText() );
+
+        assertEquals( TestClass7.class.getName(), reportEntries.get( 2 ).getSourceName() );
+        assertNull( reportEntries.get( 2 ).getSourceText() );
+        assertEquals( "testParameterizedTestCases(String, boolean)[2]", reportEntries.get( 2 ).getName() );
+        assertEquals( "[2] Always fail, false", reportEntries.get( 2 ).getNameText() );
+
+        assertEquals( TestClass7.class.getName(), reportEntries.get( 3 ).getSourceName() );
+        assertNull( reportEntries.get( 3 ).getSourceText() );
+        assertEquals( "testParameterizedTestCases(String, boolean)[2]", reportEntries.get( 3 ).getName() );
+        assertEquals( "[2] Always fail, false", reportEntries.get( 3 ).getNameText() );
+
         TestExecutionSummary summary = executionListener.summaries.get( 0 );
         assertEquals( 2, summary.getTestsFoundCount() );
         assertEquals( 2, summary.getTestsStartedCount() );
@@ -327,7 +385,7 @@ public class JUnitPlatformProviderTest
         assertEquals( 0, summary.getTestsSucceededCount() );
         assertEquals( 1, summary.getTestsFailedCount() );
 
-        summary = executionListener.summaries.get( 1 );
+        summary = executionListener.summaries.get( 2 );
         assertEquals( 1, summary.getTestsFoundCount() );
         assertEquals( 1, summary.getTestsStartedCount() );
         assertEquals( 0, summary.getTestsSucceededCount() );
@@ -715,7 +773,6 @@ public class JUnitPlatformProviderTest
     private static class TestPlanSummaryListener
                     extends SummaryGeneratingListener
     {
-
         private final List<TestExecutionSummary> summaries = new ArrayList<>();
 
         @Override
@@ -950,14 +1007,6 @@ public class JUnitPlatformProviderTest
             count += 1;
             assertTrue( count >= 3 );
         }
-
-        /*@org.junit.jupiter.api.Test
-        @org.junit.jupiter.api.Order( 2 )
-        void testFailTwice2()
-        {
-            count += 1;
-            assertTrue( count >= 3 );
-        }*/
     }
 
     static class TestClass7
@@ -975,4 +1024,14 @@ public class JUnitPlatformProviderTest
             assertTrue( value );
         }
     }
+
+    @DisplayName( "<< ✨ >>" )
+    static class DisplayNameTest
+    {
+        @org.junit.jupiter.api.Test
+        @DisplayName( "73$71 ✔" )
+        void test1()
+        {
+        }
+    }
 }
diff --git a/surefire-providers/surefire-junit-platform/src/test/java/org/apache/maven/surefire/junitplatform/RunListenerAdapterTest.java b/surefire-providers/surefire-junit-platform/src/test/java/org/apache/maven/surefire/junitplatform/RunListenerAdapterTest.java
index bf85990..6e9eeeb 100644
--- a/surefire-providers/surefire-junit-platform/src/test/java/org/apache/maven/surefire/junitplatform/RunListenerAdapterTest.java
+++ b/surefire-providers/surefire-junit-platform/src/test/java/org/apache/maven/surefire/junitplatform/RunListenerAdapterTest.java
@@ -128,8 +128,8 @@ public class RunListenerAdapterTest
         verify( listener ).testStarting( entryCaptor.capture() );
 
         ReportEntry entry = entryCaptor.getValue();
-        assertEquals( MY_TEST_METHOD_NAME, entry.getName() );
-        assertEquals( MY_TEST_METHOD_NAME + "(String)", entry.getNameText() );
+        assertEquals( MY_TEST_METHOD_NAME + "(String)", entry.getName() );
+        assertNull( entry.getNameText() );
         assertEquals( MyTestClass.class.getName(), entry.getSourceName() );
         assertNull( entry.getSourceText() );
         assertNull( entry.getStackTraceWriter() );
@@ -258,7 +258,7 @@ public class RunListenerAdapterTest
         adapter.executionStarted( TestIdentifier.from( child2 ) );
         inOrder.verify( listener )
                 .testStarting( new SimpleReportEntry( MyTestClass.class.getName(), "parent",
-                        MY_TEST_METHOD_NAME, MY_TEST_METHOD_NAME + "(String)" ) );
+                        MY_TEST_METHOD_NAME + "(String)", null ) );
         inOrder.verifyNoMoreInteractions();
 
         Exception assumptionFailure = new Exception();
@@ -270,9 +270,9 @@ public class RunListenerAdapterTest
         assertThat( report.getValue().getSourceText() )
                 .isEqualTo( "parent" );
         assertThat( report.getValue().getName() )
-                .isEqualTo( MY_TEST_METHOD_NAME );
-        assertThat( report.getValue().getNameText() )
                 .isEqualTo( MY_TEST_METHOD_NAME + "(String)" );
+        assertThat( report.getValue().getNameText() )
+                .isNull();
         assertThat( report.getValue().getElapsed() )
                 .isNotNull();
         assertThat( report.getValue().getSystemProperties() )