Listeners for Screenshots on Failure

ITestListener

A TestNG listener is a class whose methods TestNG calls on events: test start, success, failure, skip. The most common use: take a screenshot whenever a test fails, without writing try/catch in every test.

public class TestListener implements ITestListener {
    private static final Logger log = LogManager.getLogger(TestListener.class);

    @Override
    public void onTestStart(ITestResult result) {
        log.info("STARTED {}", result.getName());
    }

    @Override
    public void onTestFailure(ITestResult result) {
        WebDriver driver = DriverFactory.getDriver();
        if (driver == null) return;
        File src = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
        Path target = Path.of("target", "screenshots", result.getName() + ".png");
        try {
            Files.createDirectories(target.getParent());
            Files.copy(src.toPath(), target, StandardCopyOption.REPLACE_EXISTING);
            log.error("FAILED {} - screenshot {}", result.getName(), target);
        } catch (IOException e) {
            log.warn("Could not save screenshot", e);
        }
    }
}

Registering the Listener

Example

Register it once in testng.xml (or with @Listeners(TestListener.class) on a class):

testng.xml

<suite name="ShopEase Regression">
  <listeners>
    <listener class-name="com.shopease.listeners.TestListener"/>
  </listeners>
  <test name="Checkout">
    <classes>
      <class name="com.shopease.tests.CheckoutTest"/>
    </classes>
  </test>
</suite>

Example output

10:42:17.004 INFO  [main] TestListener - STARTED applyCouponTest
10:42:21.338 ERROR [main] TestListener - FAILED applyCouponTest - screenshot target/screenshots/applyCouponTest.png
[ERROR] Tests run: 4, Failures: 1, Errors: 0, Skipped: 0
[ERROR] CheckoutTest.applyCouponTest:41 expected [₹1,169.10] but found [₹1,299.00]

Other Useful Listeners

ListenerCalled whenTypical use
ITestListenereach test starts/passes/fails/skipsscreenshots, logs, report entries
ISuiteListenersuite starts/finishesstart a report, send a Slack summary
IAnnotationTransformerannotations are readadd a retry analyzer to every test
IInvokedMethodListenerbefore/after every method, incl. configtiming, custom logs