Extent Reports 5

Setup

Extent Reports creates a single self-contained HTML file (the "Spark" report) with a dashboard, test list, logs and screenshots. It is very popular in Indian service-company frameworks because the file can be emailed to the client.

<dependency>
    <groupId>com.aventstack</groupId>
    <artifactId>extentreports</artifactId>
    <version>5.1.2</version>
</dependency>

An ExtentManager and a Listener

public final class ExtentManager {
    private static ExtentReports extent;
    private static final ThreadLocal<ExtentTest> TEST = new ThreadLocal<>();

    public static synchronized ExtentReports get() {
        if (extent == null) {
            ExtentSparkReporter spark = new ExtentSparkReporter("target/extent/ShopEaseReport.html");
            spark.config().setDocumentTitle("ShopEase UI Tests");
            spark.config().setReportName("Regression - build 412");
            spark.config().setTheme(Theme.STANDARD);
            extent = new ExtentReports();
            extent.attachReporter(spark);
            extent.setSystemInfo("Environment", "QA");
            extent.setSystemInfo("Browser", "Chrome 130");
        }
        return extent;
    }
    public static ExtentTest test() { return TEST.get(); }
    public static void setTest(ExtentTest t) { TEST.set(t); }
}

public class ExtentListener implements ITestListener {
    @Override public void onTestStart(ITestResult r) {
        ExtentManager.setTest(ExtentManager.get().createTest(r.getMethod().getMethodName())
                .assignCategory(r.getMethod().getGroups()));
    }
    @Override public void onTestSuccess(ITestResult r) { ExtentManager.test().pass("Test passed"); }
    @Override public void onTestFailure(ITestResult r) { ExtentManager.test().fail(r.getThrowable()); }
    @Override public void onTestSkipped(ITestResult r) { ExtentManager.test().skip("Skipped"); }
    @Override public void onFinish(ITestContext ctx) { ExtentManager.get().flush(); }  // writes the HTML
}

Logging Steps

ExtentManager.test().info("Opened login page");
ExtentManager.test().info("Logged in as [email protected]");
ExtentManager.test().pass("Cart count is 1");

Example

After the run:

mvn test && ls target/extent

Example output

[INFO] Tests run: 6, Failures: 1, Errors: 0, Skipped: 1
ShopEaseReport.html

(open in a browser: dashboard shows 4 passed, 1 failed, 1 skipped; the failed test addToCart shows
 the AssertionError, its logged steps and the screenshot)

Note: Forgetting extent.flush() is the number one reason for an empty report. Call it once, after all tests (in onFinish or @AfterSuite).