Careeroza
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
| Listener | Called when | Typical use |
|---|---|---|
ITestListener | each test starts/passes/fails/skips | screenshots, logs, report entries |
ISuiteListener | suite starts/finishes | start a report, send a Slack summary |
IAnnotationTransformer | annotations are read | add a retry analyzer to every test |
IInvokedMethodListener | before/after every method, incl. config | timing, custom logs |