Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import io.qameta.allure.util.ResultsUtils;
import org.testng.IAttributes;
import org.testng.IClass;
import org.testng.IConfigurationListener;
import org.testng.IInvokedMethod;
import org.testng.IInvokedMethodListener2;
import org.testng.ISuite;
Expand Down Expand Up @@ -76,7 +77,11 @@
"PMD.ExcessiveImports", "PMD.TooManyMethods", "PMD.GodClass",
"ClassFanOutComplexity", "ClassDataAbstractionCoupling", "PMD.ExcessiveClassLength"
})
public class AllureTestNg implements ISuiteListener, ITestListener, IInvokedMethodListener2 {
public class AllureTestNg implements
ISuiteListener,
ITestListener,
IInvokedMethodListener2,
IConfigurationListener {

private static final String ALLURE_UUID = "ALLURE_UUID";

Expand Down Expand Up @@ -193,14 +198,31 @@ public void onAfterClass(final ITestClass testClass) {
}

@Override
@SuppressWarnings({"Indentation", "PMD.ExcessiveMethodLength", "deprecation"})
public void onTestStart(final ITestResult testResult) {
Current current = currentTestResult.get();
if (current.isStarted()) {
current = refreshContext();
}
current.test();
final String uuid = current.getUuid();
final String parentUuid = getUniqueUuid(testResult.getTestContext());

startTestCase(testResult, parentUuid, uuid);

Optional.of(testResult)
.map(ITestResult::getMethod)
.map(ITestNGMethod::getTestClass)
.map(classContainerUuidStorage::get)
.ifPresent(testClassContainerUuid -> getLifecycle().updateTestContainer(
testClassContainerUuid,
container -> container.getChildren().add(uuid)
));
}

@SuppressWarnings({"Indentation", "PMD.ExcessiveMethodLength", "deprecation"})
protected void startTestCase(final ITestResult testResult,
final String parentUuid,
final String uuid) {
final ITestNGMethod method = testResult.getMethod();
final ITestClass testClass = method.getTestClass();
final List<Label> labels = new ArrayList<>();
Expand All @@ -223,7 +245,7 @@ public void onTestStart(final ITestResult testResult) {
labels.addAll(getLabels(testResult));
final List<Parameter> parameters = getParameters(testResult);
final TestResult result = new TestResult()
.setUuid(current.getUuid())
.setUuid(uuid)
.setHistoryId(getHistoryId(method, parameters))
.setName(getMethodName(method))
.setFullName(getQualifiedName(method))
Expand All @@ -235,17 +257,7 @@ public void onTestStart(final ITestResult testResult) {
.setLabels(labels);
processDescription(getClass().getClassLoader(), method.getConstructorOrMethod().getMethod(), result);
getLifecycle().scheduleTestCase(parentUuid, result);
getLifecycle().startTestCase(current.getUuid());

final String uuid = current.getUuid();
Optional.of(testResult)
.map(ITestResult::getMethod)
.map(ITestNGMethod::getTestClass)
.map(classContainerUuidStorage::get)
.ifPresent(testClassContainerUuid -> getLifecycle().updateTestContainer(
testClassContainerUuid,
container -> container.getChildren().add(uuid)
));
getLifecycle().startTestCase(uuid);
}

@Override
Expand All @@ -271,12 +283,18 @@ public void onTestFailure(final ITestResult result) {
}

current.after();
final String uuid = current.getUuid();

final Throwable throwable = result.getThrowable();
final Status status = getStatus(throwable);
stopTestCase(uuid, throwable, status);
}

protected void stopTestCase(final String uuid, final Throwable throwable, final Status status) {
final StatusDetails details = getStatusDetails(throwable).orElse(null);
getLifecycle().updateTestCase(current.getUuid(), setStatus(status, details));
getLifecycle().stopTestCase(current.getUuid());
getLifecycle().writeTestCase(current.getUuid());
getLifecycle().updateTestCase(uuid, setStatus(status, details));
getLifecycle().stopTestCase(uuid);
getLifecycle().writeTestCase(uuid);
}

@Override
Expand All @@ -293,10 +311,7 @@ public void onTestSkipped(final ITestResult result) {
createTestResultForTestWithoutSetup(result);
}
current.after();
final StatusDetails details = getStatusDetails(result.getThrowable()).orElse(null);
getLifecycle().updateTestCase(current.getUuid(), setStatus(Status.SKIPPED, details));
getLifecycle().stopTestCase(current.getUuid());
getLifecycle().writeTestCase(current.getUuid());
stopTestCase(current.getUuid(), result.getThrowable(), Status.SKIPPED);
}

private void createTestResultForTestWithoutSetup(final ITestResult result) {
Expand Down Expand Up @@ -441,6 +456,26 @@ public void afterInvocation(final IInvokedMethod method, final ITestResult testR
}
}

@Override
public void onConfigurationSuccess(final ITestResult itr) {
//do nothing
}

@Override
public void onConfigurationFailure(final ITestResult itr) {
final String uuid = UUID.randomUUID().toString();
final String parentUuid = UUID.randomUUID().toString();

startTestCase(itr, parentUuid, uuid);
stopTestCase(uuid, itr.getThrowable(), getStatus(itr.getThrowable()));
//do nothing
}

@Override
public void onConfigurationSkip(final ITestResult itr) {
//do nothing
}

protected String getHistoryId(final ITestNGMethod method, final List<Parameter> parameters) {
final MessageDigest digest = getMd5Digest();
final String testClassName = method.getTestClass().getName();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import io.qameta.allure.model.Parameter;
import io.qameta.allure.model.Stage;
import io.qameta.allure.model.Status;
import io.qameta.allure.model.StatusDetails;
import io.qameta.allure.model.StepResult;
import io.qameta.allure.model.TestResult;
import io.qameta.allure.model.TestResultContainer;
Expand Down Expand Up @@ -425,9 +426,12 @@ public void skippedSuiteTest() {
final AllureResults results = runTestNgSuites("suites/skipped-suite.xml");
List<TestResult> testResults = results.getTestResults();
List<TestResultContainer> testContainers = results.getTestResultContainers();
assertThat(testResults).as("Unexpected quantity of testng case results has been written")
.hasSize(2)
.flatExtracting(TestResult::getStatus).contains(Status.SKIPPED, Status.SKIPPED);
assertThat(testResults)
.extracting(TestResult::getName, TestResult::getStatus)
.contains(
tuple("skippedTest", Status.SKIPPED),
tuple("testWithOneStep", Status.SKIPPED)
);
assertThat(testContainers).as("Unexpected quantity of testng containers has been written").hasSize(4);

assertThat(findTestContainerByName(results, "Test suite 8").getBefores())
Expand Down Expand Up @@ -998,6 +1002,26 @@ public void shouldAddCorrectBeforeMethodFixturesInCaseOfParallelRun(
});
}

@Feature("Test fixtures")
@Issue("135")
@Test
public void shouldProcessConfigurationFailure() {
final AllureResults results = runTestNgSuites("suites/gh-135.xml");

assertThat(results.getTestResults())
.extracting(TestResult::getName, TestResult::getStatus)
.containsExactlyInAnyOrder(
tuple("someTest", Status.SKIPPED),
tuple("failed configuration", Status.BROKEN)
);

assertThat(results.getTestResults())
.filteredOn("name", "failed configuration")
.extracting(ExecutableItem::getStatusDetails)
.extracting(StatusDetails::getMessage)
.containsExactly("fail");
}

private AllureResults runTestNgSuites(final String... suites) {
final Consumer<TestNG> emptyConfigurer = testNg -> {
};
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package io.qameta.allure.testng.samples;

import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;

/**
* @author charlie (Dmitry Baev).
*/
public class ConfigurationFailure {

@BeforeTest(description = "failed configuration")
public void setUp() {
throw new RuntimeException("fail");
}

@Test
public void someTest() {
}

}
10 changes: 10 additions & 0 deletions allure-testng/src/test/resources/suites/gh-135.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >

<suite name="Github Issues">
<test name="gh-135">
<classes>
<class name="io.qameta.allure.testng.samples.ConfigurationFailure"/>
</classes>
</test>
</suite>