- TestNG Tutorial
- TestNG - Home
- TestNG - Overview
- TestNG - Environment
- TestNG - Writing Tests
- TestNG - Basic Annotations
- TestNG - Execution Procedure
- TestNG - Executing Tests
- TestNG - Suite Test
- TestNG - Ignore a Test
- TestNG - Group Test
- TestNG - Exception Test
- TestNG - Dependency Test
- TestNG - Parameterized Test
- TestNG - Run JUnit Tests
- TestNG - Test Results
- TestNG - Annotation Transformers
- TestNG - Asserts
- TestNG - Parallel Execution
- TestNG - Plug with ANT
- TestNG - Plug with Eclipse
- TestNG - TestNG - vs JUnit
- TestNG Useful Resources
- TestNG - Quick Guide
- TestNG - Useful Resources
- TestNG - Discussion
TestNG - Custom Logging
We had earlier read about the different options that TestNG provides for logging and reporting. Now, let's learn how to start using them. To start with, we will write a sample program in which we will use the ITestListener interface for logging purposes.
Create Test Case Class
Create a java class, say, SampleTest.java in /work/testng/src.
import org.testng.Assert; import org.testng.annotations.Test; public class SampleTest { @Test public void testMethodOne() { Assert.assertTrue(true); } @Test public void testMethodTwo() { Assert.assertTrue(false); } @Test(dependsOnMethods={"testMethodTwo"}) public void testMethodThree() { Assert.assertTrue(true); } }
The preceding test class contains three test methods out of which testMethodOne and testMethodThree will pass when executed, whereas testMethodTwo is made to fail by passing a false Boolean value to the Assert.assertTrue method, which is used for truth conditions in the tests.
Create Custom Logging Class
Create another new class named CustomListener.java in /work/testng/src.
import org.testng.ITestResult; import org.testng.TestListenerAdapter; public class CustomListener extends TestListenerAdapter{ private int m_count = 0; @Override public void onTestFailure(ITestResult tr) { log(tr.getName()+ "--Test method failed\n"); } @Override public void onTestSkipped(ITestResult tr) { log(tr.getName()+ "--Test method skipped\n"); } @Override public void onTestSuccess(ITestResult tr) { log(tr.getName()+ "--Test method success\n"); } private void log(String string) { System.out.print(string); if (++m_count % 40 == 0) { System.out.println(""); } } }
The above class extends TestListenerAdapter, which implements ITestListener with empty methods. Hence, no need to override other methods from the interface. You can implement the interface directly, if you prefer so.
Create testng.xml
Create testng.xml in /work/testng/src to execute test case(s).
<?xml version = "1.0" encoding = "UTF-8"?> <suite name = "Simple Logger Suite"> <listeners> <listener class-name = "CustomListener" /> </listeners> <test name = "Simple Logger test"> <classes> <class name = "SampleTest" /> </classes> </test> </suite>
Compile the SampleTest, CustomListener classes using javac.
/work/testng/src$ javac CustomListener.java SampleTest.java
Now, run the testng.xml.
/work/testng/src$ java org.testng.TestNG testng.xml
Verify the output.
testMethodOne--Test method success testMethodTwo--Test method failed testMethodThree--Test method skipped =============================================== Simple Logger Suite Total tests run: 3, Failures: 1, Skips: 1 ===============================================
We created a custom logger class, which implements the ITestListener interface and attached itself to the TestNG test suite as a listener. Methods of this listener class are invoked by TestNG when test started, at test fail, at test success, and so on. Multiple listeners can be implemented and added to the test suite execution, TestNG will invoke all the listeners that are attached to the test suite.
Logging listeners are mainly used when we need to see the continuous status of the test execution when the tests are getting executed.