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

3
我正在使用TestNG框架,许多测试类扩展了Base抽象测试,提供了一些额外的信息。
我希望在整个测试类上设置@Test(enabled = false),但在TestNG中,任何方法上的@Test注释都会覆盖第一个注释。这意味着即使禁用了类,所有方法仍将运行。
我在pull请求#816中找到了框架作者提供的解决方法-添加监听器,如果定义它们的类具有@Test(enabled = false),则修改方法上的@Test注释。
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() {}
}

在这个例子中,只有testSomething被禁用了,veryGenericTest仍然运行。
1个回答

3

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>

参考资料


你应该接受自己的答案并关闭问题。 - juherr
1
@juherr:在我能够接受自己的答案之前,我不得不等待48小时,已完成。感谢您联系 :) - Piotr Lewandowski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接