根据条件和测试类注释禁用TestNG测试

时间:2019-02-26 12:05:08

标签: java testng

我有一个不时需要在产品环境中使用的测试套件,但是由于技术细节,无法对其进行一些测试。我的想法是使用自定义注释对此类测试类进行注释,如果我针对产品运行,则在其中禁用测试方法。像这样:

    @DisableOnProd
    class SomeTestClass {   
    @BeforeMethod
    void setUp(){
        ...
    }   
    @Test
    void test() {
        ...
    }   
}

我可以像这样实现IAnnotationTransformer2来接近目标,但是它将禁用所有测试方法:

    @Override
    public void transform(ITestAnnotation iTestAnnotation, Class aClass, Constructor constructor, Method method) {
    if (method.isAnnotationPresent(Test.class) || method.isAnnotationPresent(BeforeMethod.class)) {
        iTestAnnotation.setEnabled(false);
    }
}

}

有没有办法获取测试类注释来检查条件,或者有办法与其他解决方案获得相同的结果?

3 个答案:

答案 0 :(得分:2)

您可以在某些情况下使用testng监听器 onTestStart ,如下所述:

public class TestListener extends TestListenerAdapter {



      public void onTestStart(ITestResult arg0) {

            super.onTestStart(arg0);



            if (condition)  {

                  throw new SkipException("Testing skip.");

            }



      }

}

或可以使用具有某些条件的Before方法

@BeforeMethod
public void checkCondition() {
  if (condition) {
    throw new SkipException("Skipping tests .");
  }
}

答案 1 :(得分:1)

尝试在课堂上查看其他条件下的注释。例如:

   if(someCondition && testMethod.getDeclaringClass().isAnnotationPresent(DisableOnProd.class)) {
            iTestAnnotation.setEnabled(false);
   }

答案 2 :(得分:0)

感谢您的回答,他们为我指明了正确的方向。到目前为止,我获得的最灵活的解决方案是使用实现IMethodInterceptor的侦听器:

public class SkipOnProductionListener implements IMethodInterceptor {

    public List<IMethodInstance> intercept(List<IMethodInstance> list, ITestContext iTestContext) {
        if (isProduction()) {
            list.removeIf(method -> method.getMethod().getRealClass().isAnnotationPresent(SkipIfOnProd.class));
            list.removeIf(method -> method.getMethod().getConstructorOrMethod().getMethod().isAnnotationPresent(SkipIfOnProd.class));
        }
        return list;
    }

    private boolean isProduction() {
        //do some env determination logic here
        return true;
    }

}

这样,我可以将注释放在类上,并跳过所有测试方法,或者仅跳过单个方法。