javaseleniumtestingextentreportsselenium-extent-report

Skipped test is not logged as Skipped in ExtentReport4


I got 2 tests: addNewVideo and deleteRecentVideo where the second one depends on first one. After first fails, second gets ignored and it's not running. After opening my Extent Report, it looks like this: enter image description here

I'm expecting to have 2 tests - 1 failed, 1 skipped, but it's not showing properly on the report.

ExtentListener.class


import com.aventstack.extentreports.*;
import com.aventstack.extentreports.markuputils.*;
import org.testng.*;
import java.util.*;
import static constants.FileResources.REPORT_DIR;

public class ExtentListener implements ITestListener {

    private static Date d = new Date();
    private static String fileName = String.format("%s%s%s%s", d.toString().replaceAll("[: ]", "_"), "_", System.getenv("env"), ".html");
    private static ExtentReports extent = ExtentManager.createInstance(REPORT_DIR + fileName);
    public static ThreadLocal<ExtentTest> testReport = new ThreadLocal<>();

    @Override
    public void onTestStart(ITestResult result) {
        ExtentTest test = extent.createTest(result.getTestClass().getName() + "." + result.getMethod().getMethodName());
        test.assignCategory(result.getTestClass().getName());
        testReport.set(test);
    }

    @Override
    public void onTestSuccess(ITestResult result) {
        String methodName = result.getMethod().getMethodName();
        String logText = methodName + " PASSED";
        Markup m = MarkupHelper.createLabel(logText, ExtentColor.GREEN);
        testReport.get().pass(m);
    }

    @Override
    public void onTestFailure(ITestResult result) {
        String methodName = result.getMethod().getMethodName();
        String excepionMessage = Arrays.toString(result.getThrowable().getStackTrace());
        testReport.get().fail("<details>" + "<summary>" + "<b>" + "<font color=" + "red>" + "Exception occured: Expand to check details"
                + "</font>" + "</b >" + "</summary>" + excepionMessage.replaceAll(",", "<br>") + "</details>" + " \n");
        String failureLog = methodName + " FAILED";
        Markup m = MarkupHelper.createLabel(failureLog, ExtentColor.RED);
        testReport.get().log(Status.FAIL, m);
    }

    @Override
    public void onTestSkipped(ITestResult result) {
        String methodName = result.getMethod().getMethodName();
        String logText = "<b>" + methodName + " SKIPPED" + "</b>";
        Markup m = MarkupHelper.createLabel(logText, ExtentColor.ORANGE);
        testReport.get().skip(m);
    }

    @Override
    public void onTestFailedButWithinSuccessPercentage(ITestResult result) {

    }

    @Override
    public void onStart(ITestContext context) {

    }

    @Override
    public void onFinish(ITestContext context) {
        if (extent != null) {
            extent.flush();
        }
    }
}

I've tried implementing IInvokedMethodListener but no success. Is there any way to show skipped tests properly on ExtentReport4?


Solution

  • I tried IInvokeMethodListener2 once again, but it's just a workaround.

    If method from dependsOnMethods failed, the test method was not executed at all, therefore it was not logged as skipped. My solution is to tag dependant methods as description and check before invocation if it contains any failed method from test class.

    public class MethodListener implements IInvokedMethodListener2 {
    
        @Override
        public void beforeInvocation(IInvokedMethod method, ITestResult testResult, ITestContext context) {
    
            List<String> failed = context
                            .getFailedTests()
                            .getAllMethods()
                            .stream()
                            .map(ITestNGMethod::getMethodName)
                            .collect(Collectors.toList());
    
            boolean isSkippable = false;
            if (failed.size() > 0 && method.getTestMethod().getDescription() != null) {
                List<String> methodNames = Arrays.asList(method.getTestMethod().getDescription().split(";"));
                isSkippable = failed
                                .stream()
                                .anyMatch(methodNames::contains);
            }
    
    
            if (isSkippable) {
                throw new SkipException("Skipping " + method.getTestMethod().getMethodName());
            }
    
        }
    
        @Override
        public void afterInvocation(IInvokedMethod method, ITestResult testResult, ITestContext context) {
    
        }
    
        @Override
        public void beforeInvocation(IInvokedMethod method, ITestResult testResult) {
    
        }
    
        @Override
        public void afterInvocation(IInvokedMethod method, ITestResult testResult) {
    
        }
    }
    
    @Listeners({MethodListener.class, ExtentListener.class})
    public class SampleTest extends TestsBase {
    
        @Test(priority = 1)
        public void pass() {
            System.out.println("pass");
        }
    
        @Test(priority = 2)
        public void fail1() {
            System.out.println("fail1");
            Assert.fail();
        }
    
        @Test(priority = 3)
        public void fail2() {
            System.out.println("fail2");
            Assert.fail();
        }
    
        @Test(priority = 4)
        public void fail3() {
            System.out.println("fail3");
            Assert.fail();
        }
    
        @Test(priority = 5)
        public void fail4() {
            System.out.println("fail4");
            Assert.fail();
        }
    
        @Test(priority = 6, description = "pass;fail2")
        public void skip1() {
            System.out.println("skip1");
        }
    
        @Test(priority = 7, description = "pass;fail3")
        public void skip2() {
            System.out.println("skip2");
        }
    }
    

    enter image description here