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 92fb3cfd9..3612b8dd7 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 @@ -500,6 +500,9 @@ public void onConfigurationFailure(final ITestResult itr) { startTestCase(itr, parentUuid, uuid); + addChildToContainer(getUniqueUuid(itr.getTestContext()), uuid); + addChildToContainer(getUniqueUuid(itr.getTestContext().getSuite()), uuid); + addClassContainerChild(itr.getMethod().getTestClass(), uuid); // results created for configuration failure should not be considered as test cases. getLifecycle().updateTestCase( uuid, @@ -732,12 +735,15 @@ private Consumer setStatus(final Status status, final StatusDetails } private void addClassContainerChild(final ITestClass clazz, final String childUuid) { + this.addChildToContainer(classContainerUuidStorage.get(clazz), childUuid); + } + + private void addChildToContainer(final String containerUuid, final String childUuid) { lock.writeLock().lock(); try { - final String parentUuid = classContainerUuidStorage.get(clazz); - if (nonNull(parentUuid)) { + if (nonNull(containerUuid)) { getLifecycle().updateTestContainer( - parentUuid, + containerUuid, container -> container.getChildren().add(childUuid) ); } 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 326189c89..0d6c930a3 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 @@ -49,6 +49,7 @@ import java.util.Collection; import java.util.List; import java.util.Objects; +import java.util.Optional; import java.util.function.Consumer; import java.util.function.Predicate; import java.util.stream.Collectors; @@ -1113,6 +1114,33 @@ public void shouldSupportFactoryOnConstructor() { ); } + @DataProvider(name = "failedFixtures") + public Object[][] failedFixtures() { + return new Object[][]{ + {"suites/failed-before-test-fixture.xml", "beforeTest"}, + {"suites/failed-before-class-fixture.xml", "beforeClass"}, + {"suites/failed-before-suite-fixture.xml", "beforeSuite"} + }; + } + + @Test(dataProvider = "failedFixtures") + @AllureFeatures.Fixtures + public void shouldAddBeforeFixtureToFakeTestResult(final String suite, final String fixture) { + System.out.println(suite); + System.out.println(fixture); + final AllureResults results = runTestNgSuites(suite); + final Optional result = results.getTestResults().stream() + .filter(r -> r.getName().contains(fixture)) + .findAny(); + assertThat(result).as("Before failed fake test result").isNotEmpty(); + final Optional befores = results.getTestResultContainers().stream() + .filter(c -> Objects.nonNull(c.getBefores()) && c.getBefores().size() > 0) + .findAny(); + assertThat(result).as("Before failed configuration container").isNotEmpty(); + assertThat(befores.get().getChildren()) + .contains(result.get().getUuid()); + } + @Step("Run testng suites {suites}") private AllureResults runTestNgSuites(final Consumer configurer, final String... suites) { diff --git a/allure-testng/src/test/java/io/qameta/allure/testng/samples/FailedBeforeClass.java b/allure-testng/src/test/java/io/qameta/allure/testng/samples/FailedBeforeClass.java new file mode 100644 index 000000000..f28c7a7d8 --- /dev/null +++ b/allure-testng/src/test/java/io/qameta/allure/testng/samples/FailedBeforeClass.java @@ -0,0 +1,37 @@ +/* + * Copyright 2019 Qameta Software OÜ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.qameta.allure.testng.samples; + +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; + +import static io.qameta.allure.Allure.step; + +/** + * @author charlie (Dmitry Baev). + */ +public class FailedBeforeClass { + + @BeforeClass + public void beforeClass() throws Exception { + step("before class step"); + throw new RuntimeException(); + } + + @Test + public void skipped() throws Exception { + } +} diff --git a/allure-testng/src/test/java/io/qameta/allure/testng/samples/FailedBeforeMethod.java b/allure-testng/src/test/java/io/qameta/allure/testng/samples/FailedBeforeMethod.java index b0b1eaa34..85b1326ae 100644 --- a/allure-testng/src/test/java/io/qameta/allure/testng/samples/FailedBeforeMethod.java +++ b/allure-testng/src/test/java/io/qameta/allure/testng/samples/FailedBeforeMethod.java @@ -18,6 +18,8 @@ import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; +import static io.qameta.allure.Allure.step; + /** * @author charlie (Dmitry Baev). */ @@ -25,6 +27,7 @@ public class FailedBeforeMethod { @BeforeMethod public void beforeMethod() throws Exception { + step("before method step"); throw new RuntimeException(); } diff --git a/allure-testng/src/test/java/io/qameta/allure/testng/samples/FailedBeforeSuite.java b/allure-testng/src/test/java/io/qameta/allure/testng/samples/FailedBeforeSuite.java index c025d019d..f0f10afef 100644 --- a/allure-testng/src/test/java/io/qameta/allure/testng/samples/FailedBeforeSuite.java +++ b/allure-testng/src/test/java/io/qameta/allure/testng/samples/FailedBeforeSuite.java @@ -18,6 +18,8 @@ import org.testng.annotations.BeforeSuite; import org.testng.annotations.Test; +import static io.qameta.allure.Allure.step; + /** * @author charlie (Dmitry Baev). */ @@ -25,6 +27,7 @@ public class FailedBeforeSuite { @BeforeSuite public void beforeSuite() throws Exception { + step("before suite step"); throw new RuntimeException(); } diff --git a/allure-testng/src/test/java/io/qameta/allure/testng/samples/FailedBeforeTest.java b/allure-testng/src/test/java/io/qameta/allure/testng/samples/FailedBeforeTest.java index e4964f946..0e57ae2d3 100644 --- a/allure-testng/src/test/java/io/qameta/allure/testng/samples/FailedBeforeTest.java +++ b/allure-testng/src/test/java/io/qameta/allure/testng/samples/FailedBeforeTest.java @@ -18,6 +18,8 @@ import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; +import static io.qameta.allure.Allure.step; + /** * @author charlie (Dmitry Baev). */ @@ -25,6 +27,7 @@ public class FailedBeforeTest { @BeforeTest public void beforeTest() throws Exception { + step("before test step"); throw new RuntimeException(); } diff --git a/allure-testng/src/test/resources/suites/failed-before-class-fixture.xml b/allure-testng/src/test/resources/suites/failed-before-class-fixture.xml new file mode 100644 index 000000000..74377bcad --- /dev/null +++ b/allure-testng/src/test/resources/suites/failed-before-class-fixture.xml @@ -0,0 +1,10 @@ + + + + + + + + + +