Step 1: Add the extentreport dependency in POM.xml
<dependency> <groupId>com.aventstack</groupId> <artifactId>extentreports</artifactId> <version>3.1.5</version> </dependency>
Step2: Prepare a ExtentReportListener which implents IReporter. below is an example.
1 public class ExtentReportListener implements IReporter { 2 3 private static final String OUTPUT_FOLDER = "target/"; 4 private static final String FILE_NAME = "ExtentReport.html"; 5 6 private ExtentReports extent; 7 8 9 @Override 10 public void generateReport(List<XmlSuite> xmlSuites, List<ISuite> suites, String outputDirectory) { 11 init(xmlSuites); 12 13 for (ISuite suite : suites) { 14 Map<String, ISuiteResult> result = suite.getResults(); 15 16 for (ISuiteResult r : result.values()) { 17 ITestContext context = r.getTestContext(); 18 19 buildTestNodes(context.getFailedTests(), Status.FAIL); 20 buildTestNodes(context.getSkippedTests(), Status.SKIP); 21 buildTestNodes(context.getPassedTests(), Status.PASS); 22 23 } 24 } 25 26 for (String s : Reporter.getOutput()) { 27 extent.setTestRunnerOutput(s); 28 } 29 30 extent.flush(); 31 } 32 33 34 private void init(List<XmlSuite> xmlSuites) { 35 String suiteName = xmlSuites.get(0).getName(); 36 ExtentHtmlReporter htmlReporter = new ExtentHtmlReporter(OUTPUT_FOLDER + FILE_NAME); 37 htmlReporter.config().setDocumentTitle("ExtentReports: " + suiteName); 38 htmlReporter.config().setReportName(suiteName); 39 htmlReporter.config().setTestViewChartLocation(ChartLocation.TOP); 40 htmlReporter.config().setTheme(Theme.STANDARD); 41 htmlReporter.config().setChartVisibilityOnOpen(true); 42 htmlReporter.config().setEncoding("utf-8"); 43 //Fix the report with css stype 44 htmlReporter.config().setResourceCDN(ResourceCDN.EXTENTREPORTS); 45 46 extent = new ExtentReports(); 47 extent.attachReporter(htmlReporter); 48 extent.setReportUsesManualConfiguration(true); 49 } 50 51 52 private void buildTestNodes(IResultMap tests, Status status) { 53 // IResultMap is not sorted. To make it look nice in report first we need to sort tests (sort by start time) 54 SortedSet<ITestResult> sortedSet = new TreeSet<>(); 55 for (ITestResult result : tests.getAllResults()) { 56 sortedSet.add(result); 57 } 58 59 // Now we go through sorted results 60 ExtentTest test; 61 if (tests.size() > 0) { 62 for (ITestResult result : sortedSet) { 63 test = extent.createTest(result.getTestContext().getCurrentXmlTest().getName() + " - " 64 + result.getMethod().getMethodName()); 65 66 // Using Class short name instead of category 67 test.assignCategory(result.getMethod().getRealClass().getSimpleName()); 68 69 Throwable throwable = result.getThrowable(); 70 71 if (throwable != null) { 72 73 // Add parameters 74 Object[] parameters = result.getParameters(); 75 if (parameters.length > 0) { 76 try { 77 // If parameters are String 78 String params = ""; 79 for (Object object : parameters) { 80 if (params.isEmpty()) { 81 params = (String) object; 82 } else { 83 params = params + "," + (String) object; 84 } 85 } 86 test.info(params); 87 } catch (ClassCastException e) { 88 // If parameters are HashMap 89 @SuppressWarnings("unchecked") 90 HashMap<String, String> table = (HashMap<String, String>) parameters[0]; 91 test.info(table.toString()); 92 } 93 } else { 94 test.info("This test doesn't have data"); 95 } 96 97 // Finally, log throwable 98 test.log(status, throwable); 99 100 } else { 101 test.log(status, "Test " + status.toString().toLowerCase() + "ed"); 102 } 103 104 test.getModel().setStartTime(getTime(result.getStartMillis())); 105 test.getModel().setEndTime(getTime(result.getEndMillis())); 106 } 107 } 108 } 109 110 111 private Date getTime(long millis) { 112 Calendar calendar = Calendar.getInstance(); 113 calendar.setTimeInMillis(millis); 114 return calendar.getTime(); 115 } 116 }
Step3: update the testng.xml to add the listener
<listeners> <listener class-name="ExtentReportListener" /> </listeners>
Step4: run the test suite and check the report with a browser.