t.me/atinfo_chat Telegram группа по автоматизации тестирования

Как скипнуть/задизейблить все тесты по условию в TestNG Java

Теги: #<Tag:0x00007f74853df580> #<Tag:0x00007f74853df4b8> #<Tag:0x00007f74853df3f0> #<Tag:0x00007f74853df328> #<Tag:0x00007f74853df260>

Подскажите как в проекте java+maven+testng скипнуть все тесты по какому-либо условию?

Проблема: когда, например, сервер лежит- не имеет смысла запускать тесты которые бегают по GUI.
Так что было бы хорошо добавить условие типа “если получил 503 - то скипаем все тесты”

Вопрос в том, как это реализовать. Пробовал через AnnotationTransformer , но так и не сообразил как мне в мой TestNG добавить.setAnnotationTransformer(new MyTransformer());
так как если делать

TestNG tng = new TestNG();
tng.setAnnotationTransformer(new MyTransformer());

, то на мои тесты это никак не влияет, а как получить current TestNG class - не нашел.
TestNG.getDefault() - не помогло)

финальная реализация, которая с треском провалилась, выглядит примерно так:

@BeforeSuite()
public void skifAllTestIfThisFails() {
    setUp();
    driver.get(URL);
    if (!driver.getTitle().equals("Hello world")) {
        TestNG.getDefault().setAnnotationTransformer(new TestTransformer());
    }
    driver.quit()
}
public class TestTransformer implements IAnnotationTransformer {

    public void transform(ITestAnnotation annotation, Class testClass, java.lang.reflect.Constructor testConstructor, Method testMethod) {
        if (!isToRunAllTests) {
            annotation.setEnabled(false);
        }
    }
}

Сделай на CI сервере степ, который будет проверять доступность сервера и скипать все тесты в нужном случае.

Да, наверное так будет проще всего. Спасибо.
Хотя интересно как можно было бы это прикрутить прямо в проект, так как при запуске тестов из ИДЕ - ситуация по сути не изменится

А что если попробовать в @BeforeSuite написать что-то подобное

if (! isServerAvailable()) { throw new SkipException("Server is not available"); }

где isServerAvailable() метод в который Вы помещаете код проверки сервера на доступность.

Можно через листенер.

public class SkipTestsListener implements IInvokedMethodListener {

    @Override
    public void beforeInvocation(IInvokedMethod iInvokedMethod, ITestResult iTestResult) {
        if (iTestResult.getMethod().isTest() && !isServerAvailable()) {
            throw new SkipException("Server is not available");
        }
    }
}

В этом случае чтобы проскипать к примеру 50 тестов, 50 раз выполнится проверка !isServerAvailable()?

Все зависит от реализации самого метода isServerAvailable().
Если хотите проверять перед каждым тестом, то да. Если достаточно один раз проверить, будет проверяться один раз.

Учитывая, что я отдельные тесты часто запускаю руками, то перед каждым таким ручным запуском одного теста - не хотелось бы проверять окружение. То есть такая проверка мне нужна только при автоматичном запуске тестов на CI.
послушал osipov_boris и реализовал так (тем более что елементы такой реализации у меня уже были в других проектах):

  1. в тимсити добавил еще один степ перед тем, что ранит тесты - в нем передал Additional Maven command line parameters: -Dsuite=envcheck
  2. в помнике настроил профиль, который получает данную пропертю и сетит её как тестНГ хмл файл
<profiles>
        <profile>
            <id>if-suite-exists</id>
            <activation>
                <property>
                    <name>!env.SUITE</name>
                </property>
            </activation>
            <properties>
                <suite>testng</suite>  <!-- default suite -->
            </properties>
        </profile>
    </profiles>

в maven-surefire-plugin suiteXmlFiles выглядит:

< suiteXmlFiles>
src/test/resources/testng/${suite}.xml
< /suiteXmlFiles>

3.Добавил еще 1 тестНг.хмл , в котором описаны тесты, прохождение которых обязательно для последующего запуска всех тестов, название файла = значение проперти из тимсити-Dsuite=envcheck

src/test/resources/testng/envcheck.xml

Мне кажется, что решение не самое красивое, буду думать как это можно будет реализовать оптимальней, но в принципе работает хорошо. Если тесты из степа 1 валятся, то степ 2 скипается, чего и хотелось.