如何在TestNG中禁用整个测试(包括继承的方法)

时间:2017-03-08 21:49:12

标签: java inheritance reflection testng

我正在使用TestNG框架,许多测试类扩展了Base abstract Test,提供了一些额外的信息。

我想在整个测试类上设置@Test(enabled = false),这在TestNG中是有问题的,因为方法上的任何@Test注释都会覆盖第一个。这意味着,即使是禁用类,所有方法都会运行。

我发现框架作者在拉取请求#816中提供了解决方法 - 添加了监听器,如果定义了类@Test的类,则会修改@Test(enabled = false)注释:

public class TestClassDisabler implements IAnnotationTransformer {

  @Override
  public void transform(ITestAnnotation annotation, Class testClass, Constructor testConstructor,
                        Method testMethod) {
    if (testMethod != null) {
      Test test = testMethod.getDeclaringClass().getAnnotation(Test.class);
      if (test != null && !test.enabled()) {
        annotation.setEnabled(false);
      }
    }
  }
}

它就像一个魅力,但只适用于不使用继承的测试。对于这种情况,来自侦听器的testMethod.getDeclaringClass()返回声明方法的原始类,而不是启动方法的对象实例类。

@Test(enabled = false)
class SpecificTest extends BaseTest {

    @Test
    public void testSomething() {}
}

abstract class BaseTest {

    @Test
    public void veryGenericTest() {}
}

对于此示例,仅禁用testSomethingveryGenericTest仍然运行。

1 个答案:

答案 0 :(得分:2)

IAnnotationTransformer在这里不是一个好选择。没有简单的方法来获取仅基于Method接口的调用方法的原始实例。我们只能获得声明方法的基类。

其他解决方案适用于IMethodInterceptor,它允许在测试套件启动之前过滤掉方法并提供对测试类实例的访问。

public class TestMethodsDisabler implements IMethodInterceptor {

    @Override
    public List<IMethodInstance> intercept(List<IMethodInstance> methods, ITestContext context) {
        List<IMethodInstance> testsToRun = new ArrayList<>();

        for (IMethodInstance method : methods) {
            Test testClass = method.getInstance()
                .getClass()
                .getAnnotation(Test.class);

            if (testClass == null || testClass.enabled()) {
                testsToRun.add(method);
            }
        }

        return testsToRun;
    }
}

这样,当我们在类上设置@Test(enabled = false)注释时,标准方法和继承方法都被禁用。

需要使用此拦截器在testng.xml中创建测试套件:

<suite name="ListenersSuite" parallel="false">
    <listeners>
        <listener class-name="your.package.support.TestMethodsDisabler"/>
    </listeners>

    <test name="all-test" preserve-order="true" verbose="2">
        <packages>
            <package name="your.package.tests.*"/>
        </packages>
    </test>
</suite>

<强>参考