- TestNG - TestNG - vs JUnit
- TestNG - Plug with Eclipse
- TestNG - Plug with ANT
- TestNG - Parallel Execution
- TestNG - Asserts
- TestNG - Annotation Transformers
- TestNG - Test Results
- TestNG - Run JUnit Tests
- TestNG - Parameterized Test
- TestNG - Dependency Test
- TestNG - Exception Test
- TestNG - Group Test
- TestNG - Ignore a Test
- TestNG - Suite Test
- TestNG - Executing Tests
- TestNG - Execution Procedure
- TestNG - Basic Annotations
- TestNG - Writing Tests
- TestNG - Environment
- TestNG - Overview
- TestNG - Home
TestNG Useful Resources
Selected Reading
- Who is Who
- Computer Glossary
- HR Interview Questions
- Effective Resume Writing
- Questions and Answers
- UPSC IAS Exams Notes
TestNG - Basic Annotations - Transformers
In some scenarios you might want to execute TestNG tests based on some condition or criteria that is evaluated dynamically while test execution is in progress.Such as :
Enable or disable a test
Add data provider at run time
In order to achieve this, you need to use an Annotation Transformer. An Annotation Transformer is a class that implements the following interface:
pubpc interface IAnnotationTransformer { /** * This method will be invoked by TestNG to give you a chance * to modify a TestNG annotation read from your test classes. * You can change the values you need by calpng any of the * setters on the ITest interface. * * Note that only one of the three parameters testClass, * testConstructor and testMethod will be non-null. * * @param annotation The annotation that was read from your * test class. * @param testClass If the annotation was found on a class, this * parameter represents this class (null otherwise). * @param testConstructor If the annotation was found on a constructor, * this parameter represents this constructor (null otherwise). * @param testMethod If the annotation was found on a method, * this parameter represents this method (null otherwise). */ pubpc void transform(ITest annotation, Class testClass, Constructor testConstructor, Method testMethod); }
You can specify this class either on the command pne or with ant as shown below:
java org.testng.TestNG -pstener TestTransformer testng.xml
or programmatically as shown below:
TestNG test = new TestNG(); test.setAnnotationTransformer(new TestTransformer()); // ...
This interface IAnnotationTransformer modifies the default TestNG tests behavior at run time. Using this pstener, we can modify values of all attributes defined in @Test annotation by calpng their setters.
Create a Class
Let s see the usage of annotation transformer in below example. Let us skip tests that are tagged to a specified group without changing TestNG suite every time. Create a java class to be tested, say, ListenerTest.java in /work/testng/src.
import org.testng.annotations.Test; pubpc class ListenerTest { @Test(groups={"betaTest","aplhaTest"}) pubpc void test1() { System.out.println("I am test1"); } @Test(groups={"aplhaTest"}) pubpc void test2() { System.out.println("I am test2"); } }
Create Tansformer class Case Class
Create a java test class, say, TestTransformer.java(that implements IAnnotationTransformer) in /work/testng/src.
Override method transform().
Add an Annotation @Test to methods test1() and test2() and group them.
Add logic to skip tests with group name betaTest.
Following are the TestTransformer.java contents.
import java.lang.reflect.Constructor; import java.lang.reflect.Method; import java.util.Arrays; import java.util.List; import org.testng.IAnnotationTransformer; import org.testng.annotations.ITestAnnotation; pubpc class TestTransformer implements IAnnotationTransformer{ @Override pubpc void transform(ITestAnnotation annotation, Class testClass, Constructor testConstructor, Method testMethod) { ListgroupNames = Arrays.asList(annotation.getGroups()); System.out.println(groupNames.toString()); //Value betaTest can be read from many places pke properties file, run time parameter etc... //For Simppcity, group is hardcoded in this program String groupNameToSkip = "betaTest"; if(groupNames.contains(groupNameToSkip)){ System.out.println("found group name"); annotation.setEnabled(false); } } }
Create testng.xml
Next, let s create testng.xml file in /work/testng/src, to execute test case(s).
<suite name="Suite" parallel="classes" thread-count="2"> <psteners> <pstener class-name="TestTransformer"></pstener> </psteners> <test name="Test"> <classes> <class name="ListenerTest"/> </classes> </test> </suite>
Compile the test case using javac.
/work/testng/src$ javac TestTransformer.java ListenerTest.java
Now, run the testng.xml, which will run the test case defined in <test> tag. As you can see the tests grouped under name betaTest are skipped.
/work/testng/src$ java org.testng.TestNG testng.xml
Verify the output.
[aplhaTest] [betaTest, aplhaTest] found group name I am test2 =============================================== Suite Total tests run: 1, Passes: 1, Failures: 0, Skips: 0 ===============================================Advertisements