Отключить тесты TestNG на основе условия и аннотации класса теста - PullRequest
0 голосов
/ 26 февраля 2019

У меня есть набор тестов, который время от времени необходимо использовать в среде prod, но из-за технических деталей невозможно выполнить некоторые тесты на нем.Моя идея состоит в том, чтобы аннотировать такие тестовые классы с помощью пользовательских аннотаций, а затем отключать тестовые методы в них, если я работаю с Prod.Примерно так:

    @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 голосов
/ 01 марта 2019

Попробуйте проверить аннотацию, присутствующую на уроке, вместе с другими условиямиНапример:

   if(someCondition && testMethod.getDeclaringClass().isAnnotationPresent(DisableOnProd.class)) {
            iTestAnnotation.setEnabled(false);
   }
0 голосов
/ 02 марта 2019

Спасибо за ответы, они указали мне правильное направление.Пока что наиболее гибкое решение, которое у меня есть, это использование слушателя, который реализует 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;
    }

}

Таким образом, я могу разместить аннотацию либо в классе, и пропустить все методы тестирования или только отдельные методы.

0 голосов
/ 26 февраля 2019

Вы можете использовать testng listener onTestStart с некоторыми условиями, как упомянуто ниже:

public class TestListener extends TestListenerAdapter {



      public void onTestStart(ITestResult arg0) {

            super.onTestStart(arg0);



            if (condition)  {

                  throw new SkipException("Testing skip.");

            }



      }

}

или перед использованием метода с некоторыми условиями

@BeforeMethod
public void checkCondition() {
  if (condition) {
    throw new SkipException("Skipping tests .");
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...