TestNG - 基本注解 - Transformers

  • 简述

    在某些情况下,您可能希望根据在测试执行过程中动态评估的某些条件或标准来执行 TestNG 测试。例如:
    • 启用或禁用测试
    • 在运行时添加数据提供者
    为了实现这一点,您需要使用 Annotation Transformer。Annotation Transformer 是一个实现以下接口的类:
    
      public 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 calling 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).
       */
      public void transform(ITest annotation, Class testClass,
          Constructor testConstructor, Method testMethod);
      }
    
    您可以在命令行上或使用 ant 指定此类,如下所示:
    
      java org.testng.TestNG -listener TestTransformer testng.xml
    
    或以编程方式如下所示:
    
      TestNG test = new TestNG();
      test.setAnnotationTransformer(new TestTransformer());
      // ...
    
    这个接口IAnnotationTransformer在运行时修改默认的 TestNG 测试行为。使用这个监听器,我们可以通过调用它们的 setter 来修改 @Test 注释中定义的所有属性的值。
  • 创建一个类

    让我们看看下面示例中注释转换器的用法。让我们跳过标记到指定组的测试,而无需每次都更改 TestNG 套件。创建一个要测试的java类,比如说,ListenerTest.java/work/testng/src.
    
      import org.testng.annotations.Test;
      public class ListenerTest {
       @Test(groups={"betaTest","aplhaTest"})
       public void test1() {
          System.out.println("I am test1");
       }
       @Test(groups={"aplhaTest"})
       public void test2() {
          System.out.println("I am test2");
       }
      }
    
  • 创建 Tansformer 类案例类

    • 创建一个 java 测试类,比如说, TestTransformer.java(实现 IAnnotationTransformer)在 /work/testng/src.
    • 覆盖方法transform()。
    • 向方法 test1() 和 test2() 添加注释 @Test 并将它们分组。
    • 添加逻辑以跳过组名为betaTest 的测试。
    以下是TestTransformer.java 的内容。
    
      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;
      public class TestTransformer implements IAnnotationTransformer{
       @Override
       public 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 like properties file, run time parameter etc...
          //For Simplicity, group is hardcoded in this program
          String groupNameToSkip = "betaTest";
          if(groupNames.contains(groupNameToSkip)){
             System.out.println("found group name");
             annotation.setEnabled(false);
          }
       }
      }
    
  • 创建 testng.xml

    接下来,让我们在其中创建 testng.xml 文件 /work/testng/src, 执行测试用例。
    
      <suite name="Suite" parallel="classes" thread-count="2">
      <listeners>
        <listener class-name="TestTransformer"></listener>
      </listeners>
      <test name="Test">
        <classes>
          <class name="ListenerTest"/>
        </classes>
      </test>
    </suite>
    
    使用 javac 编译测试用例。
    
    /work/testng/src$ javac TestTransformer.java ListenerTest.java
    
    现在,运行 testng.xml,它将运行 <test> 标记中定义的测试用例。正如您所看到的,在名称betaTest下分组的测试被跳过。
    
    /work/testng/src$ java org.testng.TestNG testng.xml
    
    验证输出。
    
      [aplhaTest]
      [betaTest, aplhaTest]
      found group name
      I am test2
      ===============================================
      Suite
      Total tests run: 1, Passes: 1, Failures: 0, Skips: 0
      ===============================================