Maven TestNG параметризированный запуск тестов

Доброго времени суток всем, столкнулся с такой проблемой:
Уже имеется довольно длинный набор тестов в одном тестовом классе.
Я хочу разнести их по разным наборам и запускать последовательно. Для этого я создал ещё один класс и и перенес в него часть тестов с первого. А именно,
часть тестовых методов из PitiUiTest перенес в ErrorMessageTest
Тесты пишу с помощью TestNG запускаю с помощью Jenkins, в Maven плагине пишу команду mvn clean test. Все тесты запускаются в Докер-контейнере с помощью инструмента Selenoid
Конечно после того как я создал browsers.xml тесты запускаю mvn clean test -DsuiteXmlFile=browsers.xm
Но согласно документации TestNG приоритет выполнения тестовых классов определяется порядком их в XML файле но в моем случае такого не происходит, помогите найти где я ошибся.


Исходники проекта:

pom.xml

<?xml version="1.0" encoding="UTF-8"?>


4.0.0

<groupId>ua.mobox</groupId>
<artifactId>piti</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <!--<java.version>1.8</java.version>-->
    <testng.version>6.13.1</testng.version>
    <resetassured.version>3.0.7</resetassured.version>
    <jackson.version>2.8.8</jackson.version>
    <lombok.version>1.16.20</lombok.version>
    <maven.surefire.plugin>2.20.1</maven.surefire.plugin>
    <aspectj.version>1.8.10</aspectj.version>
    <allure.testng>2.6.0</allure.testng>
    <maria.db.client>2.2.3</maria.db.client>
    <webdrivermanager.version>2.1.0</webdrivermanager.version>
    <selenide.version>4.10.01</selenide.version>
</properties>
<dependencies>
    <dependency>
        <groupId>io.github.bonigarcia</groupId>
        <artifactId>webdrivermanager</artifactId>
        <version>${webdrivermanager.version}</version>
    </dependency>
    <dependency>
        <groupId>com.codeborne</groupId>
        <artifactId>selenide</artifactId>
        <version>${selenide.version}</version>
    </dependency>
    <dependency>
        <groupId>org.testng</groupId>
        <artifactId>testng</artifactId>
        <version>${testng.version}</version>
    </dependency>
    <dependency>
        <groupId>io.rest-assured</groupId>
        <artifactId>rest-assured</artifactId>
        <version>${resetassured.version}</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>${jackson.version}</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>${jackson.version}</version>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>${lombok.version}</version>
    </dependency>
    <dependency>
        <groupId>io.qameta.allure</groupId>
        <artifactId>allure-testng</artifactId>
        <version>${allure.testng}</version>
    </dependency>
    <dependency>
        <groupId>org.mariadb.jdbc</groupId>
        <artifactId>mariadb-java-client</artifactId>
        <version>${maria.db.client}</version>
    </dependency>
</dependencies>
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>${maven.surefire.plugin}</version>
            <configuration>
                <testFailureIgnore>false</testFailureIgnore>
                <argLine>
                    -javaagent:"${settings.localRepository}/org/aspectj/aspectjweaver/${aspectj.version}/aspectjweaver-${aspectj.version}.jar"
                </argLine>
                <suiteXmlFiles>
                    <suiteXmlFile>browsers.xml</suiteXmlFile>
                </suiteXmlFiles>
            </configuration>
            <dependencies>
                <dependency>
                    <groupId>org.aspectj</groupId>
                    <artifactId>aspectjweaver</artifactId>
                    <version>${aspectj.version}</version>
                </dependency>
            </dependencies>
        </plugin>
    </plugins>
</build>

вот browsers.xm:

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >

<suite name="Mobox" verbose="1" >
    <test name="Functionsl Tests">
        <classes>
            <class name="BrowsersTests.ErrorMessageTest"/>
            <class name="BrowsersTests.PitiUiTest"/>
           <class name="BrowsersTests.EmailTest"/>
        </classes>
    </test>
</suite>

Тесты запускаются в таком порядке как отсортировала их среда разработки

Вы ведь понимаете, что если за 9 часов с момента создания поста не появилось ни одного ответа, то либо никто не может помочь (что бывает крайне редко), либо что-то не так с формулировкой?! Хотя, в вашем случае одно вытекает из другого. :wink:

Попытайтесь перефразировать тему таким образом, чтобы она содержала хотя бы один вопрос. А также - коррелировала с заголовком.

Вроде все поправил. Спасибо за замечание)

Убедитесь, что:

  1. При запуске действительно используется нужный файл конфигурации testng.
  2. В искомых классах нету межклассовых зависимостей (dependsOn).

зависимостей нету но есть priority = 1,2,3…

Это ожидаемое поведение в силу наличия приоритетов. @Priority в TestNG является глобальным и имеет более высокий value, нежели порядок следования классов в xml. Детали тут:

П.С. Если убрать приоритеты, то порядок в xml будет сохранен.

1 лайк

да, но как задать последовательность выполнения тестов кроме как задать “priority”?

Попробуйте в первом классе использовать для тестовых методов priority от 1 до 100, в втором от 101 до 200 и т.д по классам, но лучше вам переработать свою архитектуру т.к если у вас используется priority значит уже что то не так. В будущем к примеру другой qa просто удалит этот весь код где будет priority т.к это будет проще чем разбираться зачем какой то из тестов запускается раньше. Так же может банально заказчик, pm или разработчик попросить “а сделай так что бы я запускал только один конкретный тест который захочу” и подход с priority опять будет разрушен, хорошо если это произойдет в начале, а если в конце? тогда надо будет много времени что бы переработать все без priority. Я сам не против использования priority, но делаю я это из 200 тестов допустим в 2-3 и то это уже самый крайний случай когда уже по другому нельзя, но обычно у любой проблемы есть несколько вариантов решения. Если же у вас в каждом классе фигурирует много priority, то надо остановится и подумать.

Вся эта затея попахивает зависимыми тестами, и, как уже заметили выше, - является не очень хорошей практикой. Исключения бывают всегда. Но не в вашем случае. Пересмотрите свои тесты, и постарайтесь сделать их максимально независимыми. Тогда же вам удастся полностью раскрыть возможности своей инфраструктуры. Selenoid придумали явно не для последовательного запуска. :wink:

Основную мысль уловил. Строить инфраструктуру начал только недавно. Когда тестов стало больше 20 и увеличились зависимости в последовательности их запуска то понял что что-то нужно менять. Нужно подумать как правильно их разнести. Спасибо за наставление на “путь истинный”))

Перебрал свои тестовые методы, убрал все зависимости, раскидал их по классам а сами классы в xml файле расположил именно в той последовательности как мне нужно что бы они запускались, но всё равно последний в списке класс запускается первым.

Что-то вы сами себе противоречите. Если бы вы убрали все зависимости, то порядок запуска был бы абсолютно не важен. Что такого особенного в ваших тестах, что они должны запускаться строго в определенном порядке?

Ну так а зачем тогда параметризованый запуск если нельзя упорядочить запуск тестовых классов? У меня были приоритеты на тестовых методах внутри классов, сейчас их нету. А согласно документации порядок запуска классов определяется в xml файле.
Вот и вопрос, что я делаю не так.

Давайте для начала определимся с терминологией. Что вы понимаете под параметризованным запуском? У TestNG, к примеру, есть целый раздел на эту тему. И он явно не связан с упорядоченным запуском, о котором вы уже 3 дня глаголите.

Конечно, можно было бы предположить, что речь о передаче cmd аргументов. Но исходя из того, что у вас он всего лишь 1 (причем, бесполезный, ввиду наличия захардкоженного значения в xml), то вывод вполне очевиден. Так что давайте не будем вводить читателей в заблуждение параметризованными запусками. :wink:

Пытаетесь теперь построить зависимость на уровне классов. Главный вопрос - зачем? Что такого уникального в ваших тестах, требующего строгой последовательности на уровне классов?

Как вы уже успели заметить, везде есть исключения (как в случае с приоритетами). И каждый кейс нужно рассматривать в отдельности.

Тут нет экстрасенсов. Если хотите получить четкий ответ на вопрос, предоставьте минимальный рабочий пример для воспроизведения проблемы. Захостите его на GitHub и киньте сюда ссылку. У вас уйдет ровно 5 мин на то, чтобы подготовить такой пример, т.к. тут потребуется всего 1 зависимость - TestNG + набор пустых тестов.

Ок, @ArtOfLife “параметризированный запуск” это я уже видать сам придумал)
мне нужно прогнать тесты связанные с отправкой нотификации на почту и ее проверкой. При чем делаю это как по UI так и по API, а почту проверяю только по UI. Вот мне и нужно что б сначала отправить нотификацию а потом ее проверить а не наоборот. проект на GitHub

[INFO] -------------------------------------------------------
[INFO]  T E S T S
[INFO] -------------------------------------------------------
[INFO] Running TestSuite
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
RecoveryPass
EmailInviteChecker
EmailInviteChecker
RecoveryPass
[INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 2.129 s - in TestSuite
1 лайк

Так я так и не понял, у меня лыжи не едут?:joy: