Listeners in TestNG
In the previous post, we have learnt about dataProvider in TestNG. In this post, we will learn about Listeners in TestNG which is a very important concept in TestNG.
What is Listeners?
As it name says, We can make TestNG to listen (or say act accordingly) when a test starts, fails , passes, skips etc. Listeners can be useful for reporting and modify TestNG behavior during run time. There are several interfaces that allow you to modify TestNG’s behavior. These interfaces are broadly called “TestNG Listeners”.
- IAnnotationTransformer
- IAnnotationTransformer2
- IHookable
- IInvokedMethodListener
- IMethodInterceptor
- IReporter
- ISuiteListener
- ITestListener
We need to implement any of these required interface to use its methods like onStart(),onFinish(), onTestFailure (),onTestSuccess etc. If our script fails, passes, skips any test then these methods will be automatically invoked. A figure depicting the same is shown below ,though it has only few methods mentioned.
Let’s talk about some of the interfaces and their methods.
ISuiteListener:
Method | Description |
onStart(ISuite arg0) | Invoked before TestNG suite starts executing. |
onFinish(ISuite arg0) | Invoked after TestNG suite finishes execution. |
ITestListener:
Method | Description |
onStart(ITestContext arg0) | Invoked after the test class is instantiated and before any configuration method is called. |
onFinish(ITestContext arg0) | Invoked after all the tests have run and all their Configuration methods have been called. |
onTestFailure(ITestResult result) | Invoked each time when a test fails. |
onTestSkipped(ITestResult arg0) | Invoked each time when a test skips. |
onTestStart(ITestResult arg0) | Invoked each time before a test will be invoked. |
onTestSuccess(ITestResult arg0) | Invoked each time when a test succeeds. |
onTestFailedButWithinSuccessPercentage(ITestResult arg0) | IInvoked each time a method fails but has been annotated with successPercentage and this failure still keeps it within the success percentage requested. |
IInvokedMethodListener:
Method | Description |
afterInvocattion() | Invoke after each method. |
beforeInvocation() | Invoke before each method. |
Let’s understanding the working of Listener step by step.
Step#1 Create a customListeners class which is implementing intefaces “ITestListener“,”ISuiteListener” and their methods that will be invoked at test pass, test failure, test skipped etc.
import org.testng.ISuite; import org.testng.ISuiteListener; import org.testng.ITestContext; import org.testng.ITestListener; import org.testng.ITestResult; public class CustomListeners implements ITestListener,ISuiteListener{ // This belongs to ISuiteListener and will execute, once the Suite is finished public void onFinish(ISuite arg0) { System.out.println("Ending Test Suite "+arg0.getName()); } // This belongs to ISuiteListener and will execute before the Suite start public void onStart(ISuite arg0) { System.out.println("Starting Test Suite "+arg0.getName()); } // This belongs to ITestListener and will execute after starting of Test set/batch public void onFinish(ITestContext arg0) { System.out.println("Finish Test execution "+arg0.getName()); } // This belongs to ITestListener and will execute before starting of Test set/batch public void onStart(ITestContext arg0) { System.out.println("Starts Test execution "+arg0.getName()); } //Not so important..ignore this as of now public void onTestFailedButWithinSuccessPercentage(ITestResult arg0) { // TODO Auto-generated method stub } // This belongs to ITestListener and will execute when a test is skipped public void onTestSkipped(ITestResult arg0) { System.out.println("Skipped test "+arg0.getName()); } // This belongs to ITestListener and will execute before the main test start i.e. @Test public void onTestStart(ITestResult arg0) { System.out.println("Starts Main Test execution "+arg0.getName()); } // This belongs to ITestListener and will execute when a test is passed public void onTestSuccess(ITestResult arg0) { System.out.println("Passed test "+arg0.getName()); } // This belongs to ITestListener and will execute when a test is failed public void onTestFailure(ITestResult arg0) { System.out.println("Failed test "+arg0.getName()); } }
Step#2 Create a ListnerTest class which will execute few methods of returning results like pass, fail , skip etc.
import org.testng.Assert; import org.testng.SkipException; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; public class ListenerTest { //Should be passed @Test public void Test1(){ System.out.println("This is Test1"); } //Should be Failed @Test public void Test2(){ System.out.println("This is Test2"); Assert.assertEquals("A", "B"); } //Should be Skipped @Test public void Test3(){ System.out.println("This is Test3"); throw new SkipException("This is a skip exception"); } @BeforeMethod public void Test4(){ System.out.println("This is Test4"); } @AfterMethod public void Test5(){ System.out.println("This is Test5"); } }
How the Listeners will be invoked?
For making Listeners effectively , we can insert a listeners tag in testng.xml. Look at the below code which is having listeners tag with class-name defined into this.
<?xml version="1.0" encoding="UTF-8"?> <suite name="ExampleTestSuite" > <listeners> <listener class-name="com.testing.CustomListeners" /> </listeners> <test name="ListenerExample"> <classes> <class name="com.testing.ListenerTest"></class> </classes> </test> </suite>
Output: After running the test, you will see the below output.