English 中文(简体)
TestNG - Annotation Transformers
  • 时间:2024-12-22

TestNG - Basic Annotations - Transformers


Previous Page Next Page  

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) {

  		List groupNames = 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