ItestListener is a listener class for running test class. Below table summarizes the methods in ItestListener class.
Method
|
Description
|
void onTestStart(ITestResult result)
|
Invoked each time before a test will be invoked.
|
void onTestSuccess(ITestResult result)
|
Invoked each time a test succeeds.
|
void onTestFailure(ITestResult result)
|
Invoked each time a test fails.
|
void onTestSkipped(ITestResult result)
|
Invoked each time a test is skipped.
|
void onTestFailedButWithinSuccessPercentage(ITestResult result)
|
Invoked each time a method fails but has been annotated with successPercentage and this failure
still keeps it within the success percentage requested.
|
void onTestFailedWithTimeout(ITestResult result)
|
Invoked each time a test fails due to a timeout.
|
void onStart(ITestContext context)
|
Invoked before running all the test methods belonging to the classes inside the test tag and calling all their Configuration methods.
|
void onFinish(ITestContext context)
|
Invoked after all the test methods belonging to the classes inside the test tag have run
and all their Configuration methods have been called.
|
Find the below working application.
Step 1: Implement ItestListener interface.
CustomTestListener.java
package com.sample.app.tests;
import org.testng.ITestContext;
import org.testng.ITestListener;
import org.testng.ITestResult;
public class CustomTestListener implements ITestListener {
public void onTestStart(ITestResult result) {
System.out.println(result.getName() + " test case started");
}
public void onTestSuccess(ITestResult result) {
System.out.println("The name of the testcase passed is :" + result.getName());
}
public void onTestFailure(ITestResult result) {
System.out.println("The name of the testcase failed is :" + result.getName());
}
public void onTestSkipped(ITestResult result) {
System.out.println("The name of the testcase skipped is :" + result.getName());
}
public void onTestFailedButWithinSuccessPercentage(ITestResult result) {
System.out.println("The name of the testcase on test failed but within success percentage :" + result.getName());
}
public void onTestFailedWithTimeout(ITestResult result) {
System.out.println("Test failed with time out :" + result.getName());
}
public void onStart(ITestContext context) {
}
public void onFinish(ITestContext context) {
System.out.println("Test Finished : " + context.getName());
}
}
Step 2: Specify the listener using @Listener annotation.
@Listeners(CustomTestListener.class)
package com.sample.app.tests;
import static org.testng.Assert.assertTrue;
import org.testng.SkipException;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Listeners;
import org.testng.annotations.Test;
@Listeners(CustomTestListener.class)
public class CustomTestListenerDemo {
@BeforeTest
public void beforeTest() {
System.out.println("Inside before test");
}
@AfterTest
public void afterTest() {
System.out.println("Inside after test");
}
@Test
public void test1() {
System.out.println("Inisde test 1");
}
@Test
public void test2() {
System.out.println("Inisde test 2");
}
@Test
public void test3() {
throw new SkipException("test3 is skipped");
}
int i = 0;
@Test(successPercentage = 50, invocationCount = 5)
public void test4() {
i++;
System.out.println("Inisde test 4, invocation count : " + i);
if (i % 2 == 0) {
assertTrue(false);
}
}
}
Run CustomTestListenerDemo.java, you will see below messages in console.
[RemoteTestNG] detected TestNG version 7.0.0
Inside before test
test1 test case started
Inisde test 1
The name of the testcase passed is :test1
test2 test case started
Inisde test 2
The name of the testcase passed is :test2
test3 test case started
The name of the testcase skipped is :test3
test4 test case started
Inisde test 4, invocation count : 1
The name of the testcase passed is :test4
test4 test case started
Inisde test 4, invocation count : 2
The name of the testcase on test failed but within success percentage :test4
test4 test case started
Inisde test 4, invocation count : 3
The name of the testcase passed is :test4
test4 test case started
Inisde test 4, invocation count : 4
The name of the testcase on test failed but within success percentage :test4
test4 test case started
Inisde test 4, invocation count : 5
The name of the testcase passed is :test4
Inside after test
Test Finished : Default test
PASSED: test1
PASSED: test2
PASSED: test4
PASSED: test4
PASSED: test4
SKIPPED: test3
org.testng.SkipException: test3 is skipped
at com.sample.app.tests.CustomTestListenerDemo.test3(CustomTestListenerDemo.java:35)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:133)
at org.testng.internal.TestInvoker.invokeMethod(TestInvoker.java:584)
at org.testng.internal.TestInvoker.invokeTestMethod(TestInvoker.java:172)
at org.testng.internal.MethodRunner.runInSequence(MethodRunner.java:46)
at org.testng.internal.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:804)
at org.testng.internal.TestInvoker.invokeTestMethods(TestInvoker.java:145)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:128)
at java.util.ArrayList.forEach(ArrayList.java:1257)
at org.testng.TestRunner.privateRun(TestRunner.java:770)
at org.testng.TestRunner.run(TestRunner.java:591)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:402)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:396)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:355)
at org.testng.SuiteRunner.run(SuiteRunner.java:304)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:53)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:96)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1180)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1102)
at org.testng.TestNG.runSuites(TestNG.java:1032)
at org.testng.TestNG.run(TestNG.java:1000)
at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:115)
at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)
===============================================
Default test
Tests run: 8, Failures: 0, Skips: 1
===============================================
===============================================
Default suite
Total tests run: 8, Passes: 5, Failures: 2, Skips: 1
===============================================
You can even specify the listener in an xml file.
CustomTestListenerDemo1.java
package com.sample.app.tests;
import static org.testng.Assert.assertTrue;
import org.testng.SkipException;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
public class CustomTestListenerDemo1 {
@BeforeTest
public void beforeTest() {
System.out.println("Inside before test");
}
@AfterTest
public void afterTest() {
System.out.println("Inside after test");
}
@Test
public void test1() {
System.out.println("Inisde test 1");
}
@Test
public void test2() {
System.out.println("Inisde test 2");
}
@Test
public void test3() {
throw new SkipException("test3 is skipped");
}
int i = 0;
@Test(successPercentage = 50, invocationCount = 5)
public void test4() {
i++;
System.out.println("Inisde test 4, invocation count : " + i);
if (i % 2 == 0) {
assertTrue(false);
}
}
}
listenerDemo.xml
<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd" >
<suite name="sanity test suite" time-out="5000">
<listeners>
<listener
class-name="com.sample.app.tests.CustomTestListener"></listener>
</listeners>
<test name="Demo test app">
<classes>
<class name="com.sample.app.tests.CustomTestListenerDemo1"></class>
</classes>
</test>
</suite>
How to run the test from xml file?
Right click on xml file -> Run As -> TestNG Suite.
No comments:
Post a Comment