diff --git a/src/main/java/com/epam/reportportal/testng/TestNGService.java b/src/main/java/com/epam/reportportal/testng/TestNGService.java index d23881ab..15dbad1c 100644 --- a/src/main/java/com/epam/reportportal/testng/TestNGService.java +++ b/src/main/java/com/epam/reportportal/testng/TestNGService.java @@ -16,6 +16,7 @@ package com.epam.reportportal.testng; import com.epam.reportportal.annotations.Description; +import com.epam.reportportal.annotations.DisplayName; import com.epam.reportportal.annotations.ParameterKey; import com.epam.reportportal.annotations.TestCaseId; import com.epam.reportportal.annotations.attribute.Attributes; @@ -710,6 +711,10 @@ protected String createConfigurationDescription(ITestResult testResult) { * @return Test/Step Name being sent to ReportPortal */ protected String createStepName(ITestResult testResult) { + var methodDisplayNameOptional = getMethodAnnotation(DisplayName.class, testResult); + if(methodDisplayNameOptional.isPresent()){ + return methodDisplayNameOptional.get().value(); + } String testStepName = testResult.getTestName(); return testStepName == null ? testResult.getMethod().getMethodName() : testStepName; } diff --git a/src/test/java/com/epam/reportportal/testng/BuildStepTest.java b/src/test/java/com/epam/reportportal/testng/BuildStepTest.java index d3388809..d52c01f3 100644 --- a/src/test/java/com/epam/reportportal/testng/BuildStepTest.java +++ b/src/test/java/com/epam/reportportal/testng/BuildStepTest.java @@ -17,6 +17,7 @@ package com.epam.reportportal.testng; import com.epam.reportportal.annotations.Description; +import com.epam.reportportal.annotations.DisplayName; import com.epam.reportportal.annotations.ParameterKey; import com.epam.reportportal.annotations.TestCaseId; import com.epam.reportportal.annotations.TestCaseIdKey; @@ -65,13 +66,9 @@ public class BuildStepTest { @Mock private ConstructorOrMethod constructorOrMethod; - @Mock - private Description descriptionAnnotation; - @BeforeEach public void initMocks() { testNGService = new TestNGService(new MemoizingSupplier<>(() -> launch)); - descriptionAnnotation = mock(Description.class); } @Test @@ -84,6 +81,17 @@ public void testMethodName() { assertThat("Incorrect test item name", rq.getName(), is(DEFAULT_NAME)); } + @Test + public void testMethodNameDisplayNameAnnotated() { + when(testResult.getMethod()).thenReturn(testNGMethod); + when(testNGMethod.getConstructorOrMethod()).thenReturn(constructorOrMethod); + when(testNGMethod.isTest()).thenReturn(true); + Method method = getTestMethodsExampleByName("testDisplayNameAnnotation"); + when(constructorOrMethod.getMethod()).thenReturn(method); + StartTestItemRQ rq = testNGService.buildStartStepRq(testResult); + assertThat("Incorrect test item name", rq.getName(), is(DEFAULT_NAME_DISPLAY_NAME_ANNOTATION)); + } + @Test public void testDescription() { when(testResult.getMethod()).thenReturn(testNGMethod); @@ -376,6 +384,11 @@ private void testCaseIdParameterized(@TestCaseIdKey String param) { private void testDescriptionAnnotation() { //just for testing providing annotation } + + @DisplayName(DEFAULT_NAME_DISPLAY_NAME_ANNOTATION) + private void testDisplayNameAnnotation() { + //just for testing providing annotation + } } } diff --git a/src/test/java/com/epam/reportportal/testng/Constants.java b/src/test/java/com/epam/reportportal/testng/Constants.java index 02263e64..2e28caab 100644 --- a/src/test/java/com/epam/reportportal/testng/Constants.java +++ b/src/test/java/com/epam/reportportal/testng/Constants.java @@ -31,6 +31,7 @@ public class Constants { static final String BASIC_URL = "basic_url"; static final String DEFAULT_UUID = "default_uuid"; static final String DEFAULT_NAME = "default_name"; + static final String DEFAULT_NAME_DISPLAY_NAME_ANNOTATION = "default_display_name"; static final String DEFAULT_PROJECT = "default_project"; static final ItemAttributesRQ ATTRIBUTE = new ItemAttributesRQ("key", "value"); static final Set ATTRIBUTES = new HashSet<>(Collections.singleton(ATTRIBUTE)); diff --git a/src/test/java/com/epam/reportportal/testng/TestNameAndDescriptionTest.java b/src/test/java/com/epam/reportportal/testng/TestNameAndDescriptionTest.java index 68f58f2c..0a3b2a2a 100644 --- a/src/test/java/com/epam/reportportal/testng/TestNameAndDescriptionTest.java +++ b/src/test/java/com/epam/reportportal/testng/TestNameAndDescriptionTest.java @@ -8,6 +8,9 @@ import com.epam.reportportal.testng.integration.feature.description.DescriptionTest; import com.epam.reportportal.testng.integration.feature.name.AnnotationNamedClassTest; import com.epam.reportportal.testng.integration.feature.name.AnnotationNamedParameterizedClassTest; +import com.epam.reportportal.testng.integration.feature.name.AnnotationNamedTestAndDisplayNameMethodClassTest; +import com.epam.reportportal.testng.integration.feature.name.AnnotationNamedDisplayNameMethodClassTest; +import com.epam.reportportal.testng.integration.feature.name.AnnotationNamedDisplayNameParameterizedClassTest;; import com.epam.ta.reportportal.ws.model.StartTestItemRQ; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -57,6 +60,36 @@ public void test_name_should_be_passed_to_rp_if_specified() { assertThat(startItem.getName(), equalTo(AnnotationNamedClassTest.TEST_NAME)); } + @Test + public void test_name_should_be_passed_to_rp_if_display_name_specified() { + runTests(Collections.singletonList(TestNgListener.class), AnnotationNamedDisplayNameMethodClassTest.class); + + verify(client, times(1)).startLaunch(any()); // Start launch + verify(client, times(1)).startTestItem(any()); // Start parent suites + verify(client, times(1)).startTestItem(same(suitedUuid), any()); // Start test class + + ArgumentCaptor startTestCapture = ArgumentCaptor.forClass(StartTestItemRQ.class); + verify(client, times(1)).startTestItem(same(testClassUuid), startTestCapture.capture()); + StartTestItemRQ startItem = startTestCapture.getAllValues().get(0); + + assertThat(startItem.getName(), equalTo(AnnotationNamedDisplayNameMethodClassTest.TEST_NAME_DISPLAY)); + } + + @Test + public void test_name_should_be_passed_to_rp_if_both_test_name_and_display_name_are_specified() { + runTests(Collections.singletonList(TestNgListener.class), AnnotationNamedTestAndDisplayNameMethodClassTest.class); + + verify(client, times(1)).startLaunch(any()); // Start launch + verify(client, times(1)).startTestItem(any()); // Start parent suites + verify(client, times(1)).startTestItem(same(suitedUuid), any()); // Start test class + + ArgumentCaptor startTestCapture = ArgumentCaptor.forClass(StartTestItemRQ.class); + verify(client, times(1)).startTestItem(same(testClassUuid), startTestCapture.capture()); + StartTestItemRQ startItem = startTestCapture.getAllValues().get(0); + + assertThat(startItem.getName(), equalTo(AnnotationNamedDisplayNameMethodClassTest.TEST_NAME_DISPLAY)); + } + @Test public void test_description_should_be_passed_to_rp_if_specified() { runTests(Collections.singletonList(TestNgListener.class), DescriptionTest.class); @@ -114,4 +147,20 @@ public void test_name_should_be_passed_to_rp_if_specified_parameterized_test() { assertThat(startTestCapture.getValue().getName(), equalTo(AnnotationNamedParameterizedClassTest.TEST_NAME)); } + + @Test + public void test_name_should_be_passed_to_rp_if_specified_parameterized_test_with_display_name_annotation() { + runTests(Collections.singletonList(TestNgListener.class), AnnotationNamedDisplayNameParameterizedClassTest.class); + + verify(client, times(1)).startLaunch(any()); // Start launch + verify(client, times(1)).startTestItem(any()); // Start parent suites + verify(client, times(1)).startTestItem(same(suitedUuid), any()); // Start test class + + ArgumentCaptor startTestCapture = ArgumentCaptor.forClass(StartTestItemRQ.class); + verify(client, times(2)).startTestItem(same(testClassUuid), startTestCapture.capture()); + + startTestCapture.getAllValues().forEach(startItem -> { + assertThat(startItem.getName(), equalTo(AnnotationNamedDisplayNameMethodClassTest.TEST_NAME_DISPLAY)); + }); + } } diff --git a/src/test/java/com/epam/reportportal/testng/integration/feature/name/AnnotationNamedDisplayNameMethodClassTest.java b/src/test/java/com/epam/reportportal/testng/integration/feature/name/AnnotationNamedDisplayNameMethodClassTest.java new file mode 100644 index 00000000..95ac7c11 --- /dev/null +++ b/src/test/java/com/epam/reportportal/testng/integration/feature/name/AnnotationNamedDisplayNameMethodClassTest.java @@ -0,0 +1,19 @@ +package com.epam.reportportal.testng.integration.feature.name; + +import com.epam.reportportal.annotations.DisplayName; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.testng.annotations.Test; + +public class AnnotationNamedDisplayNameMethodClassTest { + private static final Logger LOGGER = LoggerFactory.getLogger(AnnotationNamedDisplayNameMethodClassTest.class); + + public static final String TEST_NAME_DISPLAY = "My display test name"; + + @Test + @DisplayName(TEST_NAME_DISPLAY) + public void testNameDisplayNameMethodTest() { + LOGGER.info("Inside 'testNameDisplayNameMethodTest' method"); + } + +} diff --git a/src/test/java/com/epam/reportportal/testng/integration/feature/name/AnnotationNamedDisplayNameParameterizedClassTest.java b/src/test/java/com/epam/reportportal/testng/integration/feature/name/AnnotationNamedDisplayNameParameterizedClassTest.java new file mode 100644 index 00000000..11bd1875 --- /dev/null +++ b/src/test/java/com/epam/reportportal/testng/integration/feature/name/AnnotationNamedDisplayNameParameterizedClassTest.java @@ -0,0 +1,34 @@ +package com.epam.reportportal.testng.integration.feature.name; + +import com.epam.reportportal.annotations.DisplayName; +import com.ibm.icu.text.RuleBasedNumberFormat; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; + +import java.util.Locale; + +import static com.epam.reportportal.testng.integration.feature.name.AnnotationNamedParameterizedClassTest.TEST_NAME; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; + +@Test(testName = TEST_NAME) +public class AnnotationNamedDisplayNameParameterizedClassTest { + private static final Logger LOGGER = LoggerFactory.getLogger(AnnotationNamedDisplayNameParameterizedClassTest.class); + + @DataProvider(name = "provider") + public static Object[][] getData() { + return new Object[][] { new Object[] { 1, "one" }, new Object[] { 2, "two" } }; + } + + @Test(dataProvider = "provider") + @DisplayName(AnnotationNamedDisplayNameMethodClassTest.TEST_NAME_DISPLAY) + public void testNumberConversionDisplayName(int num, String numWord) { + LOGGER.info("Number: " + num + "; expected result: " + numWord); + Locale us = Locale.US; + RuleBasedNumberFormat formatter = new RuleBasedNumberFormat(us, RuleBasedNumberFormat.SPELLOUT); + String result = formatter.format(num, "%spellout-numbering"); + assertThat(result, equalTo(numWord)); + } +} diff --git a/src/test/java/com/epam/reportportal/testng/integration/feature/name/AnnotationNamedTestAndDisplayNameMethodClassTest.java b/src/test/java/com/epam/reportportal/testng/integration/feature/name/AnnotationNamedTestAndDisplayNameMethodClassTest.java new file mode 100644 index 00000000..afb49c40 --- /dev/null +++ b/src/test/java/com/epam/reportportal/testng/integration/feature/name/AnnotationNamedTestAndDisplayNameMethodClassTest.java @@ -0,0 +1,18 @@ +package com.epam.reportportal.testng.integration.feature.name; + +import com.epam.reportportal.annotations.DisplayName; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.testng.annotations.Test; + +@Test(testName = "Name from test annotation") +public class AnnotationNamedTestAndDisplayNameMethodClassTest { + private static final Logger LOGGER = LoggerFactory.getLogger(AnnotationNamedTestAndDisplayNameMethodClassTest.class); + + @Test + @DisplayName(AnnotationNamedDisplayNameMethodClassTest.TEST_NAME_DISPLAY) + public void testNameDisplayNameMethodTest() { + LOGGER.info("Inside 'testNameDisplayNameMethodTest' method"); + } + +}