From 12cc1a7f781d7bfa032d3a4e5b2ce4b506babe7e Mon Sep 17 00:00:00 2001 From: "sergey.potanin" Date: Fri, 2 Feb 2018 11:46:41 +0300 Subject: [PATCH 1/5] - fixed allure steps processing for testng and junit4 tests with timeout, issue: allure-framework/allure2#669 - added possibility to separate lines in javadoc description --- .../java/io/qameta/allure/Description.java | 8 +++ .../qameta/allure/internal/AllureStorage.java | 9 +++- .../io/qameta/allure/util/ResultsUtils.java | 7 ++- .../io/qameta/allure/junit4/AllureJunit4.java | 11 ++-- .../junit4/FeatureCombinationsTest.java | 14 ++++++ .../junit4/samples/TestWithTimeout.java | 26 ++++++++++ .../io/qameta/allure/testng/AllureTestNg.java | 24 ++++++--- .../allure/testng/AllureTestNgTest.java | 50 ++++++++++++++++++- .../testng/samples/DescriptionsTest.java | 12 ++++- .../testng/samples/TestWithTimeout.java | 30 +++++++++++ .../resources/suites/descriptions-test.xml | 6 +-- .../resources/suites/tests-with-timeout.xml | 10 ++++ 12 files changed, 186 insertions(+), 21 deletions(-) create mode 100644 allure-junit4/src/test/java/io/qameta/allure/junit4/samples/TestWithTimeout.java create mode 100644 allure-testng/src/test/java/io/qameta/allure/testng/samples/TestWithTimeout.java create mode 100644 allure-testng/src/test/resources/suites/tests-with-timeout.xml diff --git a/allure-java-commons/src/main/java/io/qameta/allure/Description.java b/allure-java-commons/src/main/java/io/qameta/allure/Description.java index 433e2bb5e..e3a4c8583 100644 --- a/allure-java-commons/src/main/java/io/qameta/allure/Description.java +++ b/allure-java-commons/src/main/java/io/qameta/allure/Description.java @@ -26,4 +26,12 @@ * @return boolean flag to enable description extraction from javadoc. */ boolean useJavaDoc() default false; + + /** + * This flag adds <br /> tag after each line of javadoc description. + * Works only with {@link io.qameta.allure.Description#useJavaDoc()} enabled. + * + * @return boolean flag to enable line separation + */ + boolean separateLines() default false; } diff --git a/allure-java-commons/src/main/java/io/qameta/allure/internal/AllureStorage.java b/allure-java-commons/src/main/java/io/qameta/allure/internal/AllureStorage.java index 747102390..8edf370d2 100644 --- a/allure-java-commons/src/main/java/io/qameta/allure/internal/AllureStorage.java +++ b/allure-java-commons/src/main/java/io/qameta/allure/internal/AllureStorage.java @@ -21,8 +21,13 @@ public class AllureStorage { private final Map storage = new ConcurrentHashMap<>(); - private final ThreadLocal> currentStepContext = - InheritableThreadLocal.withInitial(LinkedList::new); + @SuppressWarnings("checkstyle:LineLength") + private final ThreadLocal> currentStepContext = new InheritableThreadLocal>() { + @Override + public LinkedList initialValue() { + return new LinkedList<>(); + } + }; @SuppressWarnings("PMD.NullAssignment") public Optional getCurrentStep() { diff --git a/allure-java-commons/src/main/java/io/qameta/allure/util/ResultsUtils.java b/allure-java-commons/src/main/java/io/qameta/allure/util/ResultsUtils.java index 0e3b9ec48..984592ad4 100644 --- a/allure-java-commons/src/main/java/io/qameta/allure/util/ResultsUtils.java +++ b/allure-java-commons/src/main/java/io/qameta/allure/util/ResultsUtils.java @@ -264,7 +264,11 @@ public static void processDescription(final ClassLoader classLoader, final Metho .getResource(ALLURE_DESCRIPTIONS_PACKAGE + signatureHash)) .orElseThrow(IOException::new); description = Resources.toString(resource, Charset.defaultCharset()); - item.withDescriptionHtml(description); + if (method.getAnnotation(Description.class).separateLines()) { + item.withDescriptionHtml(description.replace("\n", "
")); + } else { + item.withDescriptionHtml(description); + } } catch (IOException e) { LOGGER.warn("Unable to process description resource file for method {} {}", name, e.getMessage()); } @@ -276,4 +280,3 @@ public static void processDescription(final ClassLoader classLoader, final Metho } } - diff --git a/allure-junit4/src/main/java/io/qameta/allure/junit4/AllureJunit4.java b/allure-junit4/src/main/java/io/qameta/allure/junit4/AllureJunit4.java index 49f6a701a..97411aa66 100644 --- a/allure-junit4/src/main/java/io/qameta/allure/junit4/AllureJunit4.java +++ b/allure-junit4/src/main/java/io/qameta/allure/junit4/AllureJunit4.java @@ -45,13 +45,17 @@ * Allure Junit4 listener. */ @RunListener.ThreadSafe -@SuppressWarnings({"PMD.ExcessiveImports", "PMD.CouplingBetweenObjects"}) +@SuppressWarnings({"PMD.ExcessiveImports", "PMD.CouplingBetweenObjects", "checkstyle:ClassFanOutComplexity"}) public class AllureJunit4 extends RunListener { public static final String MD_5 = "md5"; - private final ThreadLocal testCases - = InheritableThreadLocal.withInitial(() -> UUID.randomUUID().toString()); + private final ThreadLocal testCases = new InheritableThreadLocal() { + @Override + protected String initialValue() { + return UUID.randomUUID().toString(); + } + }; private final AllureLifecycle lifecycle; @@ -279,3 +283,4 @@ private TestResult createTestResult(final String uuid, final Description descrip } } + diff --git a/allure-junit4/src/test/java/io/qameta/allure/junit4/FeatureCombinationsTest.java b/allure-junit4/src/test/java/io/qameta/allure/junit4/FeatureCombinationsTest.java index d85dcb2fe..e2c97bc3f 100644 --- a/allure-junit4/src/test/java/io/qameta/allure/junit4/FeatureCombinationsTest.java +++ b/allure-junit4/src/test/java/io/qameta/allure/junit4/FeatureCombinationsTest.java @@ -11,6 +11,7 @@ import io.qameta.allure.junit4.samples.TaggedTests; import io.qameta.allure.junit4.samples.TestWithAnnotations; import io.qameta.allure.junit4.samples.TestWithSteps; +import io.qameta.allure.junit4.samples.TestWithTimeout; import io.qameta.allure.model.Label; import io.qameta.allure.model.Link; import io.qameta.allure.model.Stage; @@ -172,6 +173,19 @@ public void shouldAddStepsToTest() throws Exception { .containsExactly("step1", "step2", "step3"); } + @Test + @DisplayName("Test with timeout and steps") + public void testWithTimeoutAndSteps() { + core.run(Request.aClass(TestWithTimeout.class)); + List testResults = results.getTestResults(); + assertThat(testResults) + .hasSize(1) + .flatExtracting(TestResult::getSteps) + .hasSize(2) + .extracting(StepResult::getName) + .containsExactly("Step 1", "Step 2"); + } + @Test @DisplayName("Annotations on method") public void shouldProcessMethodAnnotations() throws Exception { diff --git a/allure-junit4/src/test/java/io/qameta/allure/junit4/samples/TestWithTimeout.java b/allure-junit4/src/test/java/io/qameta/allure/junit4/samples/TestWithTimeout.java new file mode 100644 index 000000000..b6c16d6b0 --- /dev/null +++ b/allure-junit4/src/test/java/io/qameta/allure/junit4/samples/TestWithTimeout.java @@ -0,0 +1,26 @@ +package io.qameta.allure.junit4.samples; + +import io.qameta.allure.Step; +import org.junit.Test; + +/** + * Author: Sergey Potanin + * Date: 02/02/2018 + */ +public class TestWithTimeout { + + @Test(timeout = 100) + public void testWithSteps() { + step1(); + step2(); + } + + @Step("Step 1") + private void step1() { + } + + @Step("Step 2") + private void step2() { + } + +} diff --git a/allure-testng/src/main/java/io/qameta/allure/testng/AllureTestNg.java b/allure-testng/src/main/java/io/qameta/allure/testng/AllureTestNg.java index 414aae507..146ef09b5 100644 --- a/allure-testng/src/main/java/io/qameta/allure/testng/AllureTestNg.java +++ b/allure-testng/src/main/java/io/qameta/allure/testng/AllureTestNg.java @@ -77,20 +77,32 @@ public class AllureTestNg implements ISuiteListener, ITestListener, IInvokedMeth /** * Store current testng result uuid to attach before/after methods into. */ - private final ThreadLocal currentTestResult - = InheritableThreadLocal.withInitial(Current::new); + private final ThreadLocal currentTestResult = new InheritableThreadLocal() { + @Override + protected Current initialValue() { + return new Current(); + } + }; /** * Store current container uuid for fake containers around before/after methods. */ - private final ThreadLocal currentTestContainer - = InheritableThreadLocal.withInitial(() -> UUID.randomUUID().toString()); + private final ThreadLocal currentTestContainer = new InheritableThreadLocal() { + @Override + protected String initialValue() { + return UUID.randomUUID().toString(); + } + }; /** * Store uuid for current executable item to catch steps and attachments. */ - private final ThreadLocal currentExecutable - = InheritableThreadLocal.withInitial(() -> UUID.randomUUID().toString()); + private final ThreadLocal currentExecutable = new InheritableThreadLocal() { + @Override + protected String initialValue() { + return UUID.randomUUID().toString(); + } + }; /** * Store uuid for class test containers. diff --git a/allure-testng/src/test/java/io/qameta/allure/testng/AllureTestNgTest.java b/allure-testng/src/test/java/io/qameta/allure/testng/AllureTestNgTest.java index edf616342..1267329a9 100644 --- a/allure-testng/src/test/java/io/qameta/allure/testng/AllureTestNgTest.java +++ b/allure-testng/src/test/java/io/qameta/allure/testng/AllureTestNgTest.java @@ -36,6 +36,7 @@ import java.util.stream.Collectors; import static java.lang.String.format; +import static java.util.Arrays.asList; import static java.util.Collections.singletonList; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.tuple; @@ -97,6 +98,50 @@ public void singleTest() { .contains(Status.PASSED); } + @Feature("Basic framework support") + @Test(description = "Test with timeout") + public void testWithTimeout() { + final String testNameWithTimeout = "testWithTimeout"; + final String testNameWithoutTimeout = "testWithoutTimeout"; + runTestNgSuites("suites/tests-with-timeout.xml"); + List testResults = results.getTestResults(); + + assertThat(testResults) + .as("Test case results have not been written") + .hasSize(2) + .as("Unexpectedly passed status or stage of tests") + .allMatch(testResult -> testResult.getStatus().equals(Status.PASSED) && + testResult.getStage().equals(Stage.FINISHED)) + .extracting(TestResult::getName) + .as("Unexpectedly passed name of tests") + .containsOnlyElementsOf(asList( + testNameWithoutTimeout, + testNameWithTimeout)); + assertThat(testResults) + .flatExtracting(TestResult::getSteps) + .as("No steps present for test with timeout") + .hasSize(2) + .extracting(StepResult::getName) + .containsOnlyElementsOf(asList( + "Step of the test with timeout", + "Step of the test with no timeout")); + } + + @Feature("Descriptions") + @Test(description = "Javadoc descriptions with line separation") + public void descriptionsWithLineSeparationTest() { + final String testDescription = "Sample test description
- next line
- another line
"; + runTestNgSuites("suites/descriptions-test.xml"); + List testResult = results.getTestResults(); + + assertThat(testResult).as("Test case result has not been written") + .hasSize(2) + .filteredOn(result -> result.getName().equals("testSeparated")) + .extracting(result -> result.getDescriptionHtml().trim()) + .as("Javadoc description of test case has not been processed correctly") + .contains(testDescription); + } + @Feature("Descriptions") @Test(description = "Javadoc descriptions of tests") public void descriptionsTest() { @@ -105,7 +150,8 @@ public void descriptionsTest() { List testResult = results.getTestResults(); assertThat(testResult).as("Test case result has not been written") - .hasSize(1).first() + .hasSize(2) + .filteredOn(result -> result.getName().equals("test")) .extracting(result -> result.getDescriptionHtml().trim()) .as("Javadoc description of test case has not been processed") .contains(testDescription); @@ -461,7 +507,7 @@ public void linksTest() throws Exception { public void bddAnnotationsTest() throws Exception { runTestNgSuites("suites/bdd-annotations.xml"); - List bddLabels = Arrays.asList("epic", "feature", "story"); + List bddLabels = asList("epic", "feature", "story"); List testResults = results.getTestResults(); assertThat(testResults) .hasSize(2) diff --git a/allure-testng/src/test/java/io/qameta/allure/testng/samples/DescriptionsTest.java b/allure-testng/src/test/java/io/qameta/allure/testng/samples/DescriptionsTest.java index 6f11c4386..b2c41ab32 100644 --- a/allure-testng/src/test/java/io/qameta/allure/testng/samples/DescriptionsTest.java +++ b/allure-testng/src/test/java/io/qameta/allure/testng/samples/DescriptionsTest.java @@ -9,7 +9,6 @@ */ public class DescriptionsTest { - /** * Sample test description */ @@ -19,6 +18,17 @@ public void test() { step(); } + /** + * Sample test description + * - next line + * - another line + */ + @Description(useJavaDoc = true, separateLines = true) + @Test + public void testSeparated() { + step(); + } + /** * Sample step description */ diff --git a/allure-testng/src/test/java/io/qameta/allure/testng/samples/TestWithTimeout.java b/allure-testng/src/test/java/io/qameta/allure/testng/samples/TestWithTimeout.java new file mode 100644 index 000000000..5ce1d858f --- /dev/null +++ b/allure-testng/src/test/java/io/qameta/allure/testng/samples/TestWithTimeout.java @@ -0,0 +1,30 @@ +package io.qameta.allure.testng.samples; + +import io.qameta.allure.Step; +import org.testng.annotations.Test; + +/** + * Author: Sergey Potanin + * Date: 31/01/2018 + */ +public class TestWithTimeout { + + @Test(timeOut = 100) + public void testWithTimeout() { + stepForTimeout(); + } + + @Test(timeOut = 0) + public void testWithoutTimeout() { + step(); + } + + @Step("Step of the test with timeout") + private void stepForTimeout() { + } + + @Step("Step of the test with no timeout") + private void step() { + } + +} diff --git a/allure-testng/src/test/resources/suites/descriptions-test.xml b/allure-testng/src/test/resources/suites/descriptions-test.xml index ddf0f24e3..d146cbd7d 100644 --- a/allure-testng/src/test/resources/suites/descriptions-test.xml +++ b/allure-testng/src/test/resources/suites/descriptions-test.xml @@ -4,11 +4,7 @@ - - - - - + \ No newline at end of file diff --git a/allure-testng/src/test/resources/suites/tests-with-timeout.xml b/allure-testng/src/test/resources/suites/tests-with-timeout.xml new file mode 100644 index 000000000..2d8cac5a0 --- /dev/null +++ b/allure-testng/src/test/resources/suites/tests-with-timeout.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file From 89ca817662a9f18f46cc067e5569890a8f2653a7 Mon Sep 17 00:00:00 2001 From: "sergey.potanin" Date: Tue, 6 Feb 2018 18:43:00 +0300 Subject: [PATCH 2/5] cancel changes of @Description to add them in separate pull request --- .../java/io/qameta/allure/Description.java | 8 -------- .../io/qameta/allure/util/ResultsUtils.java | 6 +----- .../qameta/allure/testng/AllureTestNgTest.java | 18 +----------------- .../testng/samples/DescriptionsTest.java | 11 ----------- 4 files changed, 2 insertions(+), 41 deletions(-) diff --git a/allure-java-commons/src/main/java/io/qameta/allure/Description.java b/allure-java-commons/src/main/java/io/qameta/allure/Description.java index e3a4c8583..433e2bb5e 100644 --- a/allure-java-commons/src/main/java/io/qameta/allure/Description.java +++ b/allure-java-commons/src/main/java/io/qameta/allure/Description.java @@ -26,12 +26,4 @@ * @return boolean flag to enable description extraction from javadoc. */ boolean useJavaDoc() default false; - - /** - * This flag adds <br /> tag after each line of javadoc description. - * Works only with {@link io.qameta.allure.Description#useJavaDoc()} enabled. - * - * @return boolean flag to enable line separation - */ - boolean separateLines() default false; } diff --git a/allure-java-commons/src/main/java/io/qameta/allure/util/ResultsUtils.java b/allure-java-commons/src/main/java/io/qameta/allure/util/ResultsUtils.java index 984592ad4..9d74454ab 100644 --- a/allure-java-commons/src/main/java/io/qameta/allure/util/ResultsUtils.java +++ b/allure-java-commons/src/main/java/io/qameta/allure/util/ResultsUtils.java @@ -264,11 +264,7 @@ public static void processDescription(final ClassLoader classLoader, final Metho .getResource(ALLURE_DESCRIPTIONS_PACKAGE + signatureHash)) .orElseThrow(IOException::new); description = Resources.toString(resource, Charset.defaultCharset()); - if (method.getAnnotation(Description.class).separateLines()) { - item.withDescriptionHtml(description.replace("\n", "
")); - } else { - item.withDescriptionHtml(description); - } + item.withDescriptionHtml(description); } catch (IOException e) { LOGGER.warn("Unable to process description resource file for method {} {}", name, e.getMessage()); } diff --git a/allure-testng/src/test/java/io/qameta/allure/testng/AllureTestNgTest.java b/allure-testng/src/test/java/io/qameta/allure/testng/AllureTestNgTest.java index 1267329a9..79f5bc34e 100644 --- a/allure-testng/src/test/java/io/qameta/allure/testng/AllureTestNgTest.java +++ b/allure-testng/src/test/java/io/qameta/allure/testng/AllureTestNgTest.java @@ -127,21 +127,6 @@ public void testWithTimeout() { "Step of the test with no timeout")); } - @Feature("Descriptions") - @Test(description = "Javadoc descriptions with line separation") - public void descriptionsWithLineSeparationTest() { - final String testDescription = "Sample test description
- next line
- another line
"; - runTestNgSuites("suites/descriptions-test.xml"); - List testResult = results.getTestResults(); - - assertThat(testResult).as("Test case result has not been written") - .hasSize(2) - .filteredOn(result -> result.getName().equals("testSeparated")) - .extracting(result -> result.getDescriptionHtml().trim()) - .as("Javadoc description of test case has not been processed correctly") - .contains(testDescription); - } - @Feature("Descriptions") @Test(description = "Javadoc descriptions of tests") public void descriptionsTest() { @@ -150,8 +135,7 @@ public void descriptionsTest() { List testResult = results.getTestResults(); assertThat(testResult).as("Test case result has not been written") - .hasSize(2) - .filteredOn(result -> result.getName().equals("test")) + .hasSize(1).first() .extracting(result -> result.getDescriptionHtml().trim()) .as("Javadoc description of test case has not been processed") .contains(testDescription); diff --git a/allure-testng/src/test/java/io/qameta/allure/testng/samples/DescriptionsTest.java b/allure-testng/src/test/java/io/qameta/allure/testng/samples/DescriptionsTest.java index b2c41ab32..20f3d1406 100644 --- a/allure-testng/src/test/java/io/qameta/allure/testng/samples/DescriptionsTest.java +++ b/allure-testng/src/test/java/io/qameta/allure/testng/samples/DescriptionsTest.java @@ -18,17 +18,6 @@ public void test() { step(); } - /** - * Sample test description - * - next line - * - another line - */ - @Description(useJavaDoc = true, separateLines = true) - @Test - public void testSeparated() { - step(); - } - /** * Sample step description */ From 432996c299c78f71df0a4f64bf3795988061e017 Mon Sep 17 00:00:00 2001 From: "sergey.potanin" Date: Tue, 13 Mar 2018 17:42:48 +0300 Subject: [PATCH 3/5] add javadoc description to before fixture htmlDescription --- .../io/qameta/allure/testng/AllureTestNg.java | 4 +++- .../allure/testng/AllureTestNgTest.java | 16 +++++++++++++++ .../testng/samples/DescriptionsTest.java | 20 +++++++++++++++++++ 3 files changed, 39 insertions(+), 1 deletion(-) diff --git a/allure-testng/src/main/java/io/qameta/allure/testng/AllureTestNg.java b/allure-testng/src/main/java/io/qameta/allure/testng/AllureTestNg.java index 146ef09b5..dcdce66a9 100644 --- a/allure-testng/src/main/java/io/qameta/allure/testng/AllureTestNg.java +++ b/allure-testng/src/main/java/io/qameta/allure/testng/AllureTestNg.java @@ -393,11 +393,13 @@ private String getQualifiedName(final ITestNGMethod method) { } private FixtureResult getFixtureResult(final ITestNGMethod method) { - return new FixtureResult() + final FixtureResult fixtureResult = new FixtureResult() .withName(getMethodName(method)) .withStart(System.currentTimeMillis()) .withDescription(method.getDescription()) .withStage(Stage.RUNNING); + processDescription(getClass().getClassLoader(), method.getConstructorOrMethod().getMethod(), fixtureResult); + return fixtureResult; } @Override diff --git a/allure-testng/src/test/java/io/qameta/allure/testng/AllureTestNgTest.java b/allure-testng/src/test/java/io/qameta/allure/testng/AllureTestNgTest.java index 79f5bc34e..0e924f921 100644 --- a/allure-testng/src/test/java/io/qameta/allure/testng/AllureTestNgTest.java +++ b/allure-testng/src/test/java/io/qameta/allure/testng/AllureTestNgTest.java @@ -141,6 +141,22 @@ public void descriptionsTest() { .contains(testDescription); } + @Feature("Descriptions") + @Test(description = "Javadoc descriptions of befores") + public void descriptionsBefores() { + final String beforeClassDescription = "Before class description"; + final String beforeMethodDescription = "Before method description"; + runTestNgSuites("suites/descriptions-test.xml"); + List testContainers = results.getTestContainers(); + + assertThat(testContainers).as("Test containers has not been written") + .isNotEmpty() + .filteredOn(container -> !container.getBefores().isEmpty()) + .extracting(container -> container.getBefores().get(0).getDescriptionHtml().trim()) + .as("Javadoc descriptions of befores have not been processed") + .containsOnly(beforeClassDescription, beforeMethodDescription); + } + @Feature("Failed tests") @Story("Failed") @Test(description = "Test failing by assertion") diff --git a/allure-testng/src/test/java/io/qameta/allure/testng/samples/DescriptionsTest.java b/allure-testng/src/test/java/io/qameta/allure/testng/samples/DescriptionsTest.java index 20f3d1406..04211456c 100644 --- a/allure-testng/src/test/java/io/qameta/allure/testng/samples/DescriptionsTest.java +++ b/allure-testng/src/test/java/io/qameta/allure/testng/samples/DescriptionsTest.java @@ -2,6 +2,8 @@ import io.qameta.allure.Description; import io.qameta.allure.Step; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; /** @@ -9,6 +11,24 @@ */ public class DescriptionsTest { + /** + * Before class description + */ + @BeforeClass + @Description(useJavaDoc = true) + public void setUpClass() { + + } + + /** + * Before method description + */ + @BeforeMethod + @Description(useJavaDoc = true) + public void setUpMethod() { + + } + /** * Sample test description */ From cff2cf700f19b577de41f6d99e3013d717faf2fb Mon Sep 17 00:00:00 2001 From: "sergey.potanin" Date: Thu, 22 Mar 2018 13:14:48 +0300 Subject: [PATCH 4/5] just to trigger rebuild --- .../java/io/qameta/allure/testng/samples/DescriptionsTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/allure-testng/src/test/java/io/qameta/allure/testng/samples/DescriptionsTest.java b/allure-testng/src/test/java/io/qameta/allure/testng/samples/DescriptionsTest.java index 17cc8e2d5..b00c0f45d 100644 --- a/allure-testng/src/test/java/io/qameta/allure/testng/samples/DescriptionsTest.java +++ b/allure-testng/src/test/java/io/qameta/allure/testng/samples/DescriptionsTest.java @@ -56,4 +56,5 @@ public void testSeparated() { @Step("Step one") private void step() { } + } From 6c5434594356ddc9a3648af3f5b89c8c755b26f5 Mon Sep 17 00:00:00 2001 From: "sergey.potanin" Date: Wed, 11 Jul 2018 17:42:50 +0300 Subject: [PATCH 5/5] fixed javadoc description for methods with the same names --- .../descriptions/DescriptionsProcessor.java | 2 +- .../test/ProcessDescriptionsTest.java | 2 +- .../io/qameta/allure/util/ResultsUtils.java | 10 +++- .../allure/testng/AllureTestNgTest.java | 46 ++++++++++++++ .../samples/DescriptionsAnotherTest.java | 60 +++++++++++++++++++ .../suites/descriptions-test-two-classes.xml | 14 +++++ 6 files changed, 130 insertions(+), 4 deletions(-) create mode 100644 allure-testng/src/test/java/io/qameta/allure/testng/samples/DescriptionsAnotherTest.java create mode 100644 allure-testng/src/test/resources/suites/descriptions-test-two-classes.xml diff --git a/allure-descriptions-javadoc/src/main/java/io/qameta/allure/descriptions/DescriptionsProcessor.java b/allure-descriptions-javadoc/src/main/java/io/qameta/allure/descriptions/DescriptionsProcessor.java index 3e195869a..1ca9f5234 100644 --- a/allure-descriptions-javadoc/src/main/java/io/qameta/allure/descriptions/DescriptionsProcessor.java +++ b/allure-descriptions-javadoc/src/main/java/io/qameta/allure/descriptions/DescriptionsProcessor.java @@ -57,7 +57,7 @@ public boolean process(final Set annotations, final Round .map(param -> param.asType().toString()).collect(Collectors.toList()); final String name = el.getSimpleName().toString(); - final String hash = generateMethodSignatureHash(name, typeParams); + final String hash = generateMethodSignatureHash(el.getEnclosingElement().toString(), name, typeParams); try { final FileObject file = filer.createResource(StandardLocation.CLASS_OUTPUT, "allureDescriptions", hash); diff --git a/allure-descriptions-javadoc/src/test/java/io/qameta/allure/descriptions/test/ProcessDescriptionsTest.java b/allure-descriptions-javadoc/src/test/java/io/qameta/allure/descriptions/test/ProcessDescriptionsTest.java index 715418816..92fedb49b 100644 --- a/allure-descriptions-javadoc/src/test/java/io/qameta/allure/descriptions/test/ProcessDescriptionsTest.java +++ b/allure-descriptions-javadoc/src/test/java/io/qameta/allure/descriptions/test/ProcessDescriptionsTest.java @@ -21,7 +21,7 @@ public class ProcessDescriptionsTest { @Test public void captureDescriptionTest() { - final String expectedMethodSignatureHash = "-tDqkuCipddkDhc3utZvVw=="; + final String expectedMethodSignatureHash = "3bfd90093a92af33104abb88bc989a90"; JavaFileObject source = JavaFileObjects.forSourceLines( "io.qameta.allure.descriptions.test.DescriptionSample", diff --git a/allure-java-commons/src/main/java/io/qameta/allure/util/ResultsUtils.java b/allure-java-commons/src/main/java/io/qameta/allure/util/ResultsUtils.java index c7d2f297a..ac13df795 100644 --- a/allure-java-commons/src/main/java/io/qameta/allure/util/ResultsUtils.java +++ b/allure-java-commons/src/main/java/io/qameta/allure/util/ResultsUtils.java @@ -201,8 +201,11 @@ public static String getLinkTypePatternPropertyName(final String type) { return String.format("allure.link.%s.pattern", type); } - public static String generateMethodSignatureHash(final String methodName, final List parameterTypes) { + public static String generateMethodSignatureHash(final String className, + final String methodName, + final List parameterTypes) { final MessageDigest md = getMd5Digest(); + md.update(className.getBytes(StandardCharsets.UTF_8)); md.update(methodName.getBytes(StandardCharsets.UTF_8)); parameterTypes.stream() .map(string -> string.getBytes(StandardCharsets.UTF_8)) @@ -263,7 +266,10 @@ public static void processDescription(final ClassLoader classLoader, .map(Class::getTypeName) .collect(Collectors.toList()); - final String signatureHash = generateMethodSignatureHash(name, parameterTypes); + final String signatureHash = generateMethodSignatureHash( + method.getDeclaringClass().getName(), + name, + parameterTypes); readResource(classLoader, ALLURE_DESCRIPTIONS_PACKAGE + signatureHash) .map(desc -> separateLines() ? desc.replace("\n", "
") : desc) diff --git a/allure-testng/src/test/java/io/qameta/allure/testng/AllureTestNgTest.java b/allure-testng/src/test/java/io/qameta/allure/testng/AllureTestNgTest.java index c479294e7..92f9b9994 100644 --- a/allure-testng/src/test/java/io/qameta/allure/testng/AllureTestNgTest.java +++ b/allure-testng/src/test/java/io/qameta/allure/testng/AllureTestNgTest.java @@ -182,6 +182,30 @@ public void descriptionsBefores() { .containsOnly(beforeClassDescription, beforeMethodDescription); } + @Feature("Descriptions") + @Test(description = "Javadoc descriptions of befores with the same names") + public void javadocDescriptionsOfBeforesWithTheSameNames() { + runTestNgSuites("suites/descriptions-test-two-classes.xml"); + List testContainers = results.getTestContainers(); + + checkBeforeJavadocDescriptions(testContainers, "io.qameta.allure.testng.samples.DescriptionsTest.setUpMethod", "Before method description"); + checkBeforeJavadocDescriptions(testContainers, "io.qameta.allure.testng.samples.DescriptionsTest", "Before class description"); + + checkBeforeJavadocDescriptions(testContainers, "io.qameta.allure.testng.samples.DescriptionsAnotherTest.setUpMethod", "Before method description from DescriptionsAnotherTest"); + checkBeforeJavadocDescriptions(testContainers, "io.qameta.allure.testng.samples.DescriptionsAnotherTest", "Before class description from DescriptionsAnotherTest"); + } + + @Feature("Descriptions") + @Test(description = "Javadoc descriptions of tests with the same names") + public void javadocDescriptionsOfTestsWithTheSameNames() { + runTestNgSuites("suites/descriptions-test-two-classes.xml"); + List testResults = results.getTestResults(); + + checkTestJavadocDescriptions(testResults, "io.qameta.allure.testng.samples.DescriptionsTest.test", "Sample test description"); + + checkTestJavadocDescriptions(testResults, "io.qameta.allure.testng.samples.DescriptionsAnotherTest.test", "Sample test description from DescriptionsAnotherTest"); + } + @Feature("Failed tests") @Story("Failed") @Test(description = "Test failing by assertion") @@ -980,4 +1004,26 @@ private static void assertBeforeFixtures(String containerName, List containers, String methodReference, String expectedDescriptionHtml) { + assertThat(containers).as("Test containers has not been written") + .isNotEmpty() + .filteredOn(container -> !container.getBefores().isEmpty()) + .filteredOn(container -> container.getName().equals(methodReference)) + .extracting(container -> container.getBefores().get(0).getDescriptionHtml().trim()) + .as("Javadoc descriptions of befores have been processed incorrectly") + .containsOnly(expectedDescriptionHtml); + } + + @Step("Check that javadoc descriptions of tests refer to correct test methods") + private static void checkTestJavadocDescriptions(List results, String methodReference, String expectedDescriptionHtml) { + assertThat(results).as("Test results has not been written") + .isNotEmpty() + .filteredOn(result -> result.getFullName().equals(methodReference)) + .extracting(result -> result.getDescriptionHtml().trim()) + .as("Javadoc descriptions of befores have been processed incorrectly") + .containsOnly(expectedDescriptionHtml); + } + } diff --git a/allure-testng/src/test/java/io/qameta/allure/testng/samples/DescriptionsAnotherTest.java b/allure-testng/src/test/java/io/qameta/allure/testng/samples/DescriptionsAnotherTest.java new file mode 100644 index 000000000..0a79bd472 --- /dev/null +++ b/allure-testng/src/test/java/io/qameta/allure/testng/samples/DescriptionsAnotherTest.java @@ -0,0 +1,60 @@ +package io.qameta.allure.testng.samples; + +import io.qameta.allure.Description; +import io.qameta.allure.Step; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +/** + * @author Sergey Potanin sspotanin@gmail.com + */ +public class DescriptionsAnotherTest { + + /** + * Before class description from DescriptionsAnotherTest + */ + @BeforeClass + @Description(useJavaDoc = true) + public void setUpClass() { + + } + + /** + * Before method description from DescriptionsAnotherTest + */ + @BeforeMethod + @Description(useJavaDoc = true) + public void setUpMethod() { + + } + + /** + * Sample test description from DescriptionsAnotherTest + */ + @Description(useJavaDoc = true) + @Test + public void test() { + step(); + } + + /** + * Sample test description from DescriptionsAnotherTest + * - next line + * - another line + */ + @Description(useJavaDoc = true) + @Test + public void testSeparated() { + step(); + } + + /** + * Sample step description from DescriptionsAnotherTest + */ + @Description(useJavaDoc = true) + @Step("Step one") + private void step() { + } + +} diff --git a/allure-testng/src/test/resources/suites/descriptions-test-two-classes.xml b/allure-testng/src/test/resources/suites/descriptions-test-two-classes.xml new file mode 100644 index 000000000..a4ff104f6 --- /dev/null +++ b/allure-testng/src/test/resources/suites/descriptions-test-two-classes.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file