Skip to content

Commit d8d801b

Browse files
authored
add result per failed configuration (fixes allure-framework#135, fixes allure-framework#205, via allure-framework#274)
1 parent 0271fb5 commit d8d801b

File tree

4 files changed

+113
-24
lines changed

4 files changed

+113
-24
lines changed

allure-testng/src/main/java/io/qameta/allure/testng/AllureTestNg.java

Lines changed: 56 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import io.qameta.allure.util.ResultsUtils;
2222
import org.testng.IAttributes;
2323
import org.testng.IClass;
24+
import org.testng.IConfigurationListener;
2425
import org.testng.IInvokedMethod;
2526
import org.testng.IInvokedMethodListener2;
2627
import org.testng.ISuite;
@@ -76,7 +77,11 @@
7677
"PMD.ExcessiveImports", "PMD.TooManyMethods", "PMD.GodClass",
7778
"ClassFanOutComplexity", "ClassDataAbstractionCoupling", "PMD.ExcessiveClassLength"
7879
})
79-
public class AllureTestNg implements ISuiteListener, ITestListener, IInvokedMethodListener2 {
80+
public class AllureTestNg implements
81+
ISuiteListener,
82+
ITestListener,
83+
IInvokedMethodListener2,
84+
IConfigurationListener {
8085

8186
private static final String ALLURE_UUID = "ALLURE_UUID";
8287

@@ -193,14 +198,31 @@ public void onAfterClass(final ITestClass testClass) {
193198
}
194199

195200
@Override
196-
@SuppressWarnings({"Indentation", "PMD.ExcessiveMethodLength", "deprecation"})
197201
public void onTestStart(final ITestResult testResult) {
198202
Current current = currentTestResult.get();
199203
if (current.isStarted()) {
200204
current = refreshContext();
201205
}
202206
current.test();
207+
final String uuid = current.getUuid();
203208
final String parentUuid = getUniqueUuid(testResult.getTestContext());
209+
210+
startTestCase(testResult, parentUuid, uuid);
211+
212+
Optional.of(testResult)
213+
.map(ITestResult::getMethod)
214+
.map(ITestNGMethod::getTestClass)
215+
.map(classContainerUuidStorage::get)
216+
.ifPresent(testClassContainerUuid -> getLifecycle().updateTestContainer(
217+
testClassContainerUuid,
218+
container -> container.getChildren().add(uuid)
219+
));
220+
}
221+
222+
@SuppressWarnings({"Indentation", "PMD.ExcessiveMethodLength", "deprecation"})
223+
protected void startTestCase(final ITestResult testResult,
224+
final String parentUuid,
225+
final String uuid) {
204226
final ITestNGMethod method = testResult.getMethod();
205227
final ITestClass testClass = method.getTestClass();
206228
final List<Label> labels = new ArrayList<>();
@@ -223,7 +245,7 @@ public void onTestStart(final ITestResult testResult) {
223245
labels.addAll(getLabels(testResult));
224246
final List<Parameter> parameters = getParameters(testResult);
225247
final TestResult result = new TestResult()
226-
.setUuid(current.getUuid())
248+
.setUuid(uuid)
227249
.setHistoryId(getHistoryId(method, parameters))
228250
.setName(getMethodName(method))
229251
.setFullName(getQualifiedName(method))
@@ -235,17 +257,7 @@ public void onTestStart(final ITestResult testResult) {
235257
.setLabels(labels);
236258
processDescription(getClass().getClassLoader(), method.getConstructorOrMethod().getMethod(), result);
237259
getLifecycle().scheduleTestCase(parentUuid, result);
238-
getLifecycle().startTestCase(current.getUuid());
239-
240-
final String uuid = current.getUuid();
241-
Optional.of(testResult)
242-
.map(ITestResult::getMethod)
243-
.map(ITestNGMethod::getTestClass)
244-
.map(classContainerUuidStorage::get)
245-
.ifPresent(testClassContainerUuid -> getLifecycle().updateTestContainer(
246-
testClassContainerUuid,
247-
container -> container.getChildren().add(uuid)
248-
));
260+
getLifecycle().startTestCase(uuid);
249261
}
250262

251263
@Override
@@ -271,12 +283,18 @@ public void onTestFailure(final ITestResult result) {
271283
}
272284

273285
current.after();
286+
final String uuid = current.getUuid();
287+
274288
final Throwable throwable = result.getThrowable();
275289
final Status status = getStatus(throwable);
290+
stopTestCase(uuid, throwable, status);
291+
}
292+
293+
protected void stopTestCase(final String uuid, final Throwable throwable, final Status status) {
276294
final StatusDetails details = getStatusDetails(throwable).orElse(null);
277-
getLifecycle().updateTestCase(current.getUuid(), setStatus(status, details));
278-
getLifecycle().stopTestCase(current.getUuid());
279-
getLifecycle().writeTestCase(current.getUuid());
295+
getLifecycle().updateTestCase(uuid, setStatus(status, details));
296+
getLifecycle().stopTestCase(uuid);
297+
getLifecycle().writeTestCase(uuid);
280298
}
281299

282300
@Override
@@ -293,10 +311,7 @@ public void onTestSkipped(final ITestResult result) {
293311
createTestResultForTestWithoutSetup(result);
294312
}
295313
current.after();
296-
final StatusDetails details = getStatusDetails(result.getThrowable()).orElse(null);
297-
getLifecycle().updateTestCase(current.getUuid(), setStatus(Status.SKIPPED, details));
298-
getLifecycle().stopTestCase(current.getUuid());
299-
getLifecycle().writeTestCase(current.getUuid());
314+
stopTestCase(current.getUuid(), result.getThrowable(), Status.SKIPPED);
300315
}
301316

302317
private void createTestResultForTestWithoutSetup(final ITestResult result) {
@@ -441,6 +456,26 @@ public void afterInvocation(final IInvokedMethod method, final ITestResult testR
441456
}
442457
}
443458

459+
@Override
460+
public void onConfigurationSuccess(final ITestResult itr) {
461+
//do nothing
462+
}
463+
464+
@Override
465+
public void onConfigurationFailure(final ITestResult itr) {
466+
final String uuid = UUID.randomUUID().toString();
467+
final String parentUuid = UUID.randomUUID().toString();
468+
469+
startTestCase(itr, parentUuid, uuid);
470+
stopTestCase(uuid, itr.getThrowable(), getStatus(itr.getThrowable()));
471+
//do nothing
472+
}
473+
474+
@Override
475+
public void onConfigurationSkip(final ITestResult itr) {
476+
//do nothing
477+
}
478+
444479
protected String getHistoryId(final ITestNGMethod method, final List<Parameter> parameters) {
445480
final MessageDigest digest = getMd5Digest();
446481
final String testClassName = method.getTestClass().getName();

allure-testng/src/test/java/io/qameta/allure/testng/AllureTestNgTest.java

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import io.qameta.allure.model.Parameter;
1717
import io.qameta.allure.model.Stage;
1818
import io.qameta.allure.model.Status;
19+
import io.qameta.allure.model.StatusDetails;
1920
import io.qameta.allure.model.StepResult;
2021
import io.qameta.allure.model.TestResult;
2122
import io.qameta.allure.model.TestResultContainer;
@@ -425,9 +426,12 @@ public void skippedSuiteTest() {
425426
final AllureResults results = runTestNgSuites("suites/skipped-suite.xml");
426427
List<TestResult> testResults = results.getTestResults();
427428
List<TestResultContainer> testContainers = results.getTestResultContainers();
428-
assertThat(testResults).as("Unexpected quantity of testng case results has been written")
429-
.hasSize(2)
430-
.flatExtracting(TestResult::getStatus).contains(Status.SKIPPED, Status.SKIPPED);
429+
assertThat(testResults)
430+
.extracting(TestResult::getName, TestResult::getStatus)
431+
.contains(
432+
tuple("skippedTest", Status.SKIPPED),
433+
tuple("testWithOneStep", Status.SKIPPED)
434+
);
431435
assertThat(testContainers).as("Unexpected quantity of testng containers has been written").hasSize(4);
432436

433437
assertThat(findTestContainerByName(results, "Test suite 8").getBefores())
@@ -998,6 +1002,26 @@ public void shouldAddCorrectBeforeMethodFixturesInCaseOfParallelRun(
9981002
});
9991003
}
10001004

1005+
@Feature("Test fixtures")
1006+
@Issue("135")
1007+
@Test
1008+
public void shouldProcessConfigurationFailure() {
1009+
final AllureResults results = runTestNgSuites("suites/gh-135.xml");
1010+
1011+
assertThat(results.getTestResults())
1012+
.extracting(TestResult::getName, TestResult::getStatus)
1013+
.containsExactlyInAnyOrder(
1014+
tuple("someTest", Status.SKIPPED),
1015+
tuple("failed configuration", Status.BROKEN)
1016+
);
1017+
1018+
assertThat(results.getTestResults())
1019+
.filteredOn("name", "failed configuration")
1020+
.extracting(ExecutableItem::getStatusDetails)
1021+
.extracting(StatusDetails::getMessage)
1022+
.containsExactly("fail");
1023+
}
1024+
10011025
private AllureResults runTestNgSuites(final String... suites) {
10021026
final Consumer<TestNG> emptyConfigurer = testNg -> {
10031027
};
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package io.qameta.allure.testng.samples;
2+
3+
import org.testng.annotations.BeforeTest;
4+
import org.testng.annotations.Test;
5+
6+
/**
7+
* @author charlie (Dmitry Baev).
8+
*/
9+
public class ConfigurationFailure {
10+
11+
@BeforeTest(description = "failed configuration")
12+
public void setUp() {
13+
throw new RuntimeException("fail");
14+
}
15+
16+
@Test
17+
public void someTest() {
18+
}
19+
20+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
3+
4+
<suite name="Github Issues">
5+
<test name="gh-135">
6+
<classes>
7+
<class name="io.qameta.allure.testng.samples.ConfigurationFailure"/>
8+
</classes>
9+
</test>
10+
</suite>

0 commit comments

Comments
 (0)