Testng custom listener and reporter

Testng custom listener to log individual result of test method execution and custom reporter to log summary report of test suite execution.

TestNGCustomListener:

public class TestNGCustomListener extends TestListenerAdapter
{
    private static final Logger RESULT = Logger.getLogger("TEST-RESULT");

    @Override
    public void onTestFailure(ITestResult tr)
    {
        RESULT.error(
            tr.getName() + "   [FAILED] \n" + StackTraceReader.readStackTrace(tr.getThrowable())
        );
    }

    @Override
    public void onTestSkipped(ITestResult tr)
    {
        RESULT.error(
            tr.getName() + "   [SKIPPED] \n" + StackTraceReader.readStackTrace(tr.getThrowable())
        );
    }

    @Override
    public void onTestSuccess(ITestResult tr)
    {
        RESULT.info(tr.getName() + "   [PASSED] ");
    }
}

TestNGCustomReporter:

public class TestNGCustomReporter implements IReporter
{
    private static final Logger REPORT = Logger.getLogger("TEST-REPORT");

    @Override
    public void generateReport(
        List <XmlSuite> xmlSuites,
        List<ISuite> suites,
        String outputDirectory
    )
    {

        for (ISuite suite: suites)
        {
            String suiteName = suite.getName();

            int passedCount = 0;
            int skippedCount = 0;
            int failedCount = 0;

            for (ISuiteResult sr: suite.getResults().values())
            {
                passedCount += sr.getTestContext().getPassedTests().getAllResults().size();
                skippedCount += sr.getTestContext().getSkippedTests().getAllResults().size();
                failedCount += sr.getTestContext().getFailedTests().getAllResults().size();
            }

            int totalCount = passedCount + skippedCount + failedCount;

            String passed = "Passed: " + passedCount;
            String skipped = "Skipped: " + skippedCount;
            String failed = "Failed: " + failedCount;
            String total = "Total tests run: " + totalCount;

            String message = suiteName + ", " + total + ", " + passed + ", " + skipped + ", " + failed;

            if (skippedCount>0 || failedCount>0)
            {
                REPORT.info("[FAIL] " + message);
            }
            else
            {
                REPORT.info("[PASS] " + message);
            }

        }

    }
}

Config in testng.xml to use the custom listener and reporter:

<suite name="Test Suite Name" verbose="1">
    <listeners>
        <listener class-name="com.xxx.TestNGCustomListener"></listener>
        <listener class-name="com.xxx.TestNGCustomReporter"></listener>
    </listeners>

    <test name="Test Name" preserve-order="true">
        ...
    </test>
</suite>

java automation testng