Search code examples
selenium-gridextentreports

Extent report is not giving proper report on parallel execution


ReporterClass.Java:

package POM_Classes;

import com.aventstack.extentreports.AnalysisStrategy;
import com.aventstack.extentreports.ExtentReports;
import com.aventstack.extentreports.ExtentTest;
import com.aventstack.extentreports.reporter.ExtentHtmlReporter;

public class ReporterClass {

    public static ExtentHtmlReporter html;
    public ExtentReports extent;
    public ExtentTest test, suiteTest;
    public String testCaseName, testNodes, testDescription, category, authors;

    public void startResult() {
        html = new ExtentHtmlReporter("./reports/result.html");
        html.setAppendExisting(true);
        extent = new ExtentReports();

        extent.attachReporter(html);        
    }

    /*public ExtentTest startTestModule(String testCaseName, String testDescription) {
        suiteTest = extent.createTest(testCaseName, testDescription);
        return suiteTest;
    }*/

    public ExtentTest startTestCase(String testName) {
        System.out.println(testName);
        test = extent.createTest(testName);
        return test;
    }

    public void reportStep(String desc, String status) {
        if (status.equalsIgnoreCase("PASS")) {
            test.pass(desc);
        } else if (status.equalsIgnoreCase("FAIL")) {
            test.fail(desc);
        } else if (status.equalsIgnoreCase("WARNING")) {
            test.warning(desc);
        } else if (status.equalsIgnoreCase("INFO")) {
            test.info(desc);
        }
    }

    public void endTestcase() {
        extent.setAnalysisStrategy(AnalysisStrategy.CLASS);
    }

    public void endResult() {
        extent.flush();
    }

}

Usage:

@Test   
    public void 961_NavigateToMyAlertsAndAddNewAlerts()
            throws IOException, InterruptedException, ATUTestRecorderException, APIException {

        driver = launchTargetUrl(this.getClass().getSimpleName().toString());
        startResult();
        test = startTestCase(Thread.currentThread().getStackTrace()[1].getMethodName().toString()); 
        LoginApplication(driver,transactionusername, transactionuserpassword,test);
        HomePage homePage = new HomePage(driver,test);
        homePage.MyAlerts.click();
        MyAlerts myalerts = new MyAlerts(driver,test);
        String selectedcardName;
        selectedcardName = driver.findElement(myalerts.cardName).getText().trim();
        System.out.println(selectedcardName);       
    }



    @AfterMethod
    public void afterMethod(ITestResult result) throws ATUTestRecorderException {   
        resultOfTest(result);
        endTestcase();
        endResult();
        closeBrowsers(driver);
    }

The test case which first gets completed has the report and if the another test case is completed then that result overrides the old one..

If I change public static ExtentReports extent; then it maintains only thread so it logs only one test case and the other parallel execution is not even recorded.. How to resolve this?


Solution

  • Ok, here you go. I haven't tested this yet, but this should allow you to use Extent with parallel usage.

    Reporter:

    public abstract class ReporterClass {
    
        private static final ExtentReports EXTENT = ExtentManager.getInstance();
    
        public ExtentTest test, suiteTest;
        public String testCaseName, testNodes, testDescription, category, authors;
    
        public synchronized ExtentTest startTestCase(String testName) {
            System.out.println(testName);
            return ExtentTestManager.createTest(testName);
        }
    
        public synchronized void reportStep(String desc, String status) {
            if (status.equalsIgnoreCase("PASS")) {
                ExtentTestManager.getTest().pass(desc);
            } else if (status.equalsIgnoreCase("FAIL")) {
                ExtentTestManager.getTest().fail(desc);
            } else if (status.equalsIgnoreCase("WARNING")) {
                ExtentTestManager.getTest().warning(desc);
            } else if (status.equalsIgnoreCase("INFO")) {
                ExtentTestManager.getTest().info(desc);
            }
        }
    
        public synchronized void endResult() {
            EXTENT.flush();
        }
    
        @BeforeMethod
        public synchronized void beforeMethod(Method method) {
            startTestCase(method.getName());
        }
    
        @AfterMethod
        public synchronized void afterMethod(ITestResult result) throws ATUTestRecorderException {   
            reportStep(result.getThrowable(), result.getStatus());
            endResult();
            closeBrowsers(driver);
        }
    
    }
    

    Base:

    public abstract class BaseClass extends ReporterClass {
    
        // .. abstractions
    
    }
    

    Extent utils:

    public class ExtentTestManager {
    
        static Map<Integer, ExtentTest> extentTestMap = new HashMap<Integer, ExtentTest>();
        private static final ExtentReports EXTENT = ExtentManager.getInstance();
    
        public static synchronized ExtentTest getTest() {
            return extentTestMap.get((int) (long) (Thread.currentThread().getId()));
        }
    
        public static synchronized ExtentTest createTest(String testName) {
            return createTest(testName, "");
        }
    
        public static synchronized ExtentTest createTest(String testName, String desc) {
            ExtentTest test = EXTENT.createTest(testName, desc);
            extentTestMap.put((int) (long) (Thread.currentThread().getId()), test);
    
            return test;
        }
    
    }
    
    
    public class ExtentManager {
    
        private static ExtentReports extent;
    
        public synchronized static ExtentReports getInstance() {
            if (extent == null) {
                createInstance("reports/extent.html");
            }
    
            return extent;
        }
    
        public synchronized static ExtentReports createInstance(String fileName) {
            ExtentHtmlReporter htmlReporter = new ExtentHtmlReporter(fileName);
            htmlReporter.config().setTestViewChartLocation(ChartLocation.BOTTOM);
            htmlReporter.config().setChartVisibilityOnOpen(true);
            htmlReporter.config().setTheme(Theme.STANDARD);
            htmlReporter.config().setDocumentTitle(fileName);
            htmlReporter.config().setEncoding("utf-8");
            htmlReporter.config().setReportName(fileName);
            htmlReporter.setAppendExisting(true);
    
            extent = new ExtentReports();
            extent.setAnalysisStrategy(AnalysisStrategy.CLASS);
            extent.attachReporter(htmlReporter);
    
            return extent;
        }
    
    }   
    

    Finally, your slim tests. Notice there is 0 lines of reporter code here - see ReporterClass.

    public class MyTestsClass extends BaseClass {
        @Test   
        public void 961_NavigateToMyAlertsAndAddNewAlerts()
                throws IOException, InterruptedException, ATUTestRecorderException, APIException {
            driver = launchTargetUrl(this.getClass().getSimpleName().toString());
            LoginApplication(driver,transactionusername, transactionuserpassword,test);
            HomePage homePage = new HomePage(driver,test);
            homePage.MyAlerts.click();
            MyAlerts myalerts = new MyAlerts(driver,test);
            String selectedcardName;
            selectedcardName = driver.findElement(myalerts.cardName).getText().trim();
            System.out.println(selectedcardName);       
        }
    }