TestNG
​
​
​
​
​
​
​
​
​
​
​
​
​
Listeners In TestNG
​
​
What Are Listeners In TestNG ?
​
TestNG listeners are interfaces that modifies the default testNG's behaviour.
These are called when an event occurs in tests.
​
In testNG,below are the major types of listeners :
​
-
ITestListener
-
IReporter
-
IAnnotaionTransformer
-
IAnnotaionTransformer2
-
IConfigurableListener
-
IConfigurationListener
-
IExecutionListener
-
IHookable
-
IInvokedMethodListener
-
IInvokedMethodListener2
-
IMethodInterceptor
-
ISuiteListener
​
ITestListener is the most adopted listener above all.
So,here we'll move forward with ITestListener.
​
Below are the methods of interface ITestListener :
public void onStart(ITestContext context)
​
public void onFinish(ITestContext context)
​
public void onTestStart(ITestResult result)
public void onTestSuccess(ITestResult result)
​
public void onTestFailure(ITestResult result)
​
public void onTestSkipped(ITestResult result)
​
public void onTestFailedButWithinSuccessPercentage(ITestResult result)
​
​
Listeners can be implemented at two levels :
-
At Class Level
-
At Suite Level
​
Implementeing listeners at class level
To apply listeners on test classes,first create a listener class and implement the mentioned listener interface then override its methods.
Now use @Listeners annotation before the test class and pass the .class name of the created listener class.
Syntax :
@Listeners(classname.class)
​
​
Example :
​
package testNGexamples;
import org.testng.ITestContext;
import org.testng.ITestListener;
import org.testng.ITestResult;
public class ListenerClass implements ITestListener {
​
@Override
public void onStart(ITestContext context) {
System.out.println("Test Class Instantiated :");
}
​
@Override
public void onFinish(ITestContext context) {
System.out.println("All Tests Finished : :");
}
​
@Override
public void onTestStart(ITestResult result) {
System.out.println(result.getName() + "Test Method is Called :");
}
​
@Override
public void onTestSuccess(ITestResult result) {
System.out.println(result.getName() + "Test is Success :");
}
​
@Override
public void onTestFailure(ITestResult result) {
System.out.println(result.getName() + "Test Failed :");
}
​
@Override
public void onTestSkipped(ITestResult result) {
System.out.println(result.getName() + "Test skipped :");
}
​
@Override
public void onTestFailedButWithinSuccessPercentage(ITestResult result) {
System.out.println(result.getName() + "Test Failed But Within Succes Percentage :");
}
}
​
Adding above class in test class using @Listeners annotation as :
​
package testNGexamples;
import org.testng.Assert;
import org.testng.SkipException;
import org.testng.annotations.Listeners;
import org.testng.annotations.Test;
@Listeners(ListenerClass.class)
public class TestNGWithListeners {
int num = 1, i = 1;
​
@Test
public void simpleFunction() {
System.out.println("simpleFunction is Passed :");
}
​
@Test(successPercentage = 60, invocationCount = 2)
public void repeatedTest() {
Assert.assertEquals(num, i);
num++;
}
​
@Test
public void testAssertCheck() {
Assert.assertEquals(num, i);
num++;
}
​
@Test
public void testSkip() {
throw new SkipException("testSkip must be Skipped :");
}
}
​
Output :
​
[RemoteTestNG] detected TestNG version 7.4.0
Test Class Instantiated :
repeatedTestTest Method is Called :
repeatedTestTest is Success :
repeatedTestTest Method is Called :
repeatedTestTest Failed But Within Succes Percentage :
simpleFunctionTest Method is Called :
simpleFunction is Passed :
simpleFunctionTest is Success :
testAssertCheckTest Method is Called :
testAssertCheckTest Failed :
testSkipTest Method is Called :
testSkipTest skipped :
All Tests Finished : :
PASSED: simpleFunction
PASSED: repeatedTest
FAILED: testAssertCheck
===============================================
Default test
Tests run: 4, Failures: 1, Skips: 1
===============================================
===============================================
Default suite
Total tests run: 5, Passes: 2, Failures: 2, Skips: 1
===============================================
​
​
Implementeing listeners at suite level
To apply listeners at suite level,just remove @Listeners annotation from the class and add <listener> in .xml as :
​
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Test-Suite">
<listeners>
<listener class-name="testNGexamples.ListenerClass"></listener>
</listeners>
<test name="TestNG Listeners Execution">
<classes>
<class name="testNGexamples.TestNGWithListeners"></class>
</classes>
</test>
</suite>
​
Here 'ListenerClass' is the class in which interface methods have been overrided and 'TestNGWithListeners' is the class on which listener is applied.
​
​
​
​
​