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