Skip to content

Commit 41acc10

Browse files
committed
feat: Add DataProvider support to Allure report setup section
This commit implements IDataProviderListener in AllureTestNg to report DataProvider executions as fixtures in the Allure report. - Implemented beforeDataProviderExecution, afterDataProviderExecution, and onDataProviderFailure. - DataProvider executions now appear in the 'Set up' section. - Attachments added within DataProviders are now visible. - Failed DataProviders are correctly reported with BROKEN status. - Added tests to verify correct reporting of successful and failed DataProviders.
1 parent 5ad7b9e commit 41acc10

6 files changed

Lines changed: 138 additions & 1 deletion

File tree

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

Lines changed: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@
3939
import org.testng.IAttributes;
4040
import org.testng.IClass;
4141
import org.testng.IConfigurationListener;
42+
import org.testng.IDataProviderListener;
43+
import org.testng.IDataProviderMethod;
4244
import org.testng.IInvokedMethod;
4345
import org.testng.IInvokedMethodListener;
4446
import org.testng.IMethodInstance;
@@ -110,7 +112,8 @@ public class AllureTestNg implements
110112
ITestListener,
111113
IInvokedMethodListener,
112114
IConfigurationListener,
113-
IMethodInterceptor {
115+
IMethodInterceptor,
116+
IDataProviderListener {
114117

115118
private static final Logger LOGGER = LoggerFactory.getLogger(AllureTestNg.class);
116119

@@ -626,6 +629,58 @@ public void onConfigurationSkip(final ITestResult itr) {
626629
//do nothing
627630
}
628631

632+
@Override
633+
public void beforeDataProviderExecution(final IDataProviderMethod dataProviderMethod,
634+
final ITestNGMethod method,
635+
final ITestContext iTestContext) {
636+
final ITestClass testClass = method.getTestClass();
637+
final String uuid = currentExecutable.get();
638+
final FixtureResult result = new FixtureResult()
639+
.setName(dataProviderMethod.getMethod().getName())
640+
.setStage(Stage.RUNNING);
641+
642+
processDescription(
643+
getClass().getClassLoader(),
644+
dataProviderMethod.getMethod(),
645+
result::setDescription,
646+
result::setDescriptionHtml
647+
);
648+
649+
getClassContainer(testClass).ifPresent(parentUuid ->
650+
getLifecycle().startPrepareFixture(parentUuid, uuid, result)
651+
);
652+
}
653+
654+
@Override
655+
public void afterDataProviderExecution(final IDataProviderMethod dataProviderMethod,
656+
final ITestNGMethod method,
657+
final ITestContext iTestContext) {
658+
final ITestClass testClass = method.getTestClass();
659+
getClassContainer(testClass).ifPresent(parentUuid -> {
660+
final String uuid = currentExecutable.get();
661+
getLifecycle().updateFixture(uuid, result -> {
662+
if (result.getStatus() == null) {
663+
result.setStatus(Status.PASSED);
664+
}
665+
});
666+
getLifecycle().stopFixture(uuid);
667+
currentExecutable.remove();
668+
});
669+
}
670+
671+
@Override
672+
public void onDataProviderFailure(final ITestNGMethod method,
673+
final ITestContext ctx,
674+
final RuntimeException t) {
675+
final ITestClass testClass = method.getTestClass();
676+
getClassContainer(testClass).ifPresent(parentUuid -> {
677+
final String uuid = currentExecutable.get();
678+
getLifecycle().updateFixture(uuid, result -> result
679+
.setStatus(getStatus(t))
680+
.setStatusDetails(getStatusDetails(t).orElse(null)));
681+
});
682+
}
683+
629684
protected String getHistoryId(final ITestNGMethod method, final List<Parameter> parameters) {
630685
final MessageDigest digest = getMd5Digest();
631686
final String testClassName = method.getTestClass().getName();

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

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1515,6 +1515,36 @@ public AllureResults runTestPlan(final TestPlan plan, final Class<?>... testClas
15151515
});
15161516
}
15171517

1518+
@AllureFeatures.Fixtures
1519+
@Test(description = "Should process data provider in setup")
1520+
public void shouldProcessDataProviderInSetup() {
1521+
final AllureResults results = runTestNgSuites("suites/data-provider-with-attachment.xml");
1522+
1523+
assertThat(results.getTestResultContainers())
1524+
.flatExtracting(TestResultContainer::getBefores)
1525+
.extracting(FixtureResult::getName, FixtureResult::getStatus)
1526+
.contains(Tuple.tuple("dataProvider", Status.PASSED));
1527+
1528+
assertThat(results.getTestResultContainers())
1529+
.flatExtracting(TestResultContainer::getBefores)
1530+
.filteredOn("name", "dataProvider")
1531+
.flatExtracting(FixtureResult::getAttachments)
1532+
.hasSize(1)
1533+
.extracting(Attachment::getName)
1534+
.contains("attachment");
1535+
}
1536+
1537+
@AllureFeatures.Fixtures
1538+
@Test(description = "Should process failed data provider in setup")
1539+
public void shouldProcessFailedDataProviderInSetup() {
1540+
final AllureResults results = runTestNgSuites("suites/failed-data-provider.xml");
1541+
1542+
assertThat(results.getTestResultContainers())
1543+
.flatExtracting(TestResultContainer::getBefores)
1544+
.extracting(FixtureResult::getName, FixtureResult::getStatus)
1545+
.contains(Tuple.tuple("dataProvider", Status.BROKEN));
1546+
}
1547+
15181548
private Integer getOrderParameter(final TestResult result) {
15191549
return result.getParameters().stream()
15201550
.filter(p -> p.getName().equals("order"))
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 io.qameta.allure.Allure;
4+
import org.testng.annotations.DataProvider;
5+
import org.testng.annotations.Test;
6+
7+
public class DataProviderWithAttachment {
8+
9+
@DataProvider
10+
public Object[][] dataProvider() {
11+
Allure.addAttachment("attachment", "attachment content");
12+
return new Object[][]{
13+
{"a"}
14+
};
15+
}
16+
17+
@Test(dataProvider = "dataProvider")
18+
public void test(String s) {
19+
}
20+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package io.qameta.allure.testng.samples;
2+
3+
import org.testng.annotations.DataProvider;
4+
import org.testng.annotations.Test;
5+
6+
public class FailedDataProvider {
7+
8+
@DataProvider
9+
public Object[][] dataProvider() {
10+
throw new RuntimeException("Data provider failed");
11+
}
12+
13+
@Test(dataProvider = "dataProvider")
14+
public void test(String s) {
15+
}
16+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
2+
<suite name="Data Provider Suite" verbose="1" parallel="false" thread-count="1">
3+
<test name="Data Provider Test">
4+
<classes>
5+
<class name="io.qameta.allure.testng.samples.DataProviderWithAttachment" />
6+
</classes>
7+
</test>
8+
</suite>
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
2+
<suite name="Failed Data Provider Suite" verbose="1" parallel="false" thread-count="1">
3+
<test name="Failed Data Provider Test">
4+
<classes>
5+
<class name="io.qameta.allure.testng.samples.FailedDataProvider" />
6+
</classes>
7+
</test>
8+
</suite>

0 commit comments

Comments
 (0)