1
votes

Désactiver les tests TestNG en fonction de la condition et de l'annotation de classe de test

J'ai une suite de tests qui de temps en temps doit être utilisée sur l'environnement de production, mais en raison de détails techniques, il n'est pas possible d'exécuter des tests dessus. Mon idée est d'annoter ces classes de test avec des annotations personnalisées, puis de désactiver les méthodes de test si j'exécute contre prod. Quelque chose comme ceci:

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

Je peux obtenir quelque chose de proche en implémentant IAnnotationTransformer2 comme ceci, mais cela désactivera toutes les méthodes de test:

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

}

Existe-t-il un moyen d'obtenir des annotations de classe de test pour vérifier la condition ou existe-t-il un moyen d'obtenir le même résultat avec une autre solution?


0 commentaires

3 Réponses :


3
votes

Vous pouvez utiliser l'écouteur testng onTestStart avec certaines conditions comme mentionné ci-dessous:

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

ou la méthode Before avec certaines conditions peut être utilisée

public class TestListener extends TestListenerAdapter {



      public void onTestStart(ITestResult arg0) {

            super.onTestStart(arg0);



            if (condition)  {

                  throw new SkipException("Testing skip.");

            }



      }

}


0 commentaires

1
votes

Essayez de vérifier l'annotation présente sur la classe avec d'autres conditions. Par exemple:

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


0 commentaires

0
votes

Merci pour les réponses, ils m'ont indiqué la bonne direction. Jusqu'à présent, la solution la plus flexible que j'ai eue consiste à utiliser un écouteur qui implémente 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;
    }

}

De cette façon, je peux placer l'annotation soit sur la classe et ignorer toutes les méthodes de test, ou simplement des méthodes individuelles.


0 commentaires