Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

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

listeners
skip
execution
testng
java
Теги: #<Tag:0x00007f7b6d560320> #<Tag:0x00007f7b6d5601e0> #<Tag:0x00007f7b6d5600a0> #<Tag:0x00007f7b6d567c10> #<Tag:0x00007f7b6d567a08>

(Ok Tober) #1

Подскажите как в проекте 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);
        }
    }
}


(Борис Осипов) #2

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


(Ok Tober) #3

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


(Nik Sidorenko) #4

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

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

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


(cactus) #5

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

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");
        }
    }
}

(Nik Sidorenko) #6

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


(cactus) #7

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


(Ok Tober) #8

Учитывая, что я отдельные тесты часто запускаю руками, то перед каждым таким ручным запуском одного теста - не хотелось бы проверять окружение. То есть такая проверка мне нужна только при автоматичном запуске тестов на 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 скипается, чего и хотелось.