Порядок запуска тестов. selenium testNG

xml файлик с тестами выглядит примерно так:

<classes>
    <class name="ru.msk.tests.Test1"/> 
    <class name="ru.msk.tests.Test2"/> 
    <class name="ru.msk.tests.Test3"/> 
</classes>

Каждый класс Test* содержит в себе множество методов. При запуске всего проекта методы идут рандомно.
Мне хотелось бы, чтобы вначале прошли методы одного класса, а потом только запускались методы другого. Это возможно?

1 лайк

Смотря зачем это нужно.
Если есть зависимости между тестами - нужно проставить dependsOnMethods.
Если просто надо определенный порядок выполнения методов - priority.
Если надо что бы классы ранались в том порядке, что и в xml - разбивайте их в разные тесты.

2 лайка

Сначала убедитесь, что это действительно нужно. По-хорошему, тесты должны быть независимы друг от друга.

По умолчанию TestNG так и делает: тесты идут последовательно, как указано в конфиге. Методы внутри теста запускаются в алфавитном (вроде) порядке, считай не упорядочены. В документации TestNG, сказано то же самое.

By default, TestNG will run your tests in the order they are found in the XML file.

TestNG предлагает несколько способов упорядоченного запуска: от зависимостей, до упорядочения по группам.

Если никакой способ не подойдет, можно реализовать свой механизм запуска, через Listener-ы, и в нём определять порядок как вам захочется

2 лайка

Если есть возможность сразу уходите от всяких зависимостей, а не создавайте их. А чем вам не подходит dependsOnMethods и priority упомянутые @vmaximv?

А разве dependsOnMethods и priority можно применять к классам? Подскажите, как?

Про выставление зависимостей я понимаю, что чем меньше, тем лучше. В крайнем случае использовать alwaysRun. Но это все к отдельным методам.
PS: тесты пишу на Java.

@Test(priority=2)
public class Test1{
}
2 лайка

Спасибо!
По сути получается, что priority и настройка в xml идентична? Ну то есть и так и так классы будут выполняться по порядку. Или реализация таких порядков сильно отличается и в этом есть какие-то значимые нюансы?

Не уверен, что правильно понял ваш вопрос.

<test name="test">
    <classes>
        <class name="ru.msk.tests.Test1"/> 
        <class name="ru.msk.tests.Test2"/> 
        <class name="ru.msk.tests.Test3"/> 
    </classes>
</test>

В этом случае, перед выполнением теста test, TestNG соберет все тестовые методы в указанных классах, построит порядок выполнения, если есть приоритеты и зависимости. Если их нет - методы пойдут в алфавитном порядке, что в принципе и логично: представьте если у сьюта поставить parallel=“methods”.

<test name="test1">
    <classes>
        <class name="ru.msk.tests.Test1"/> 
    </classes>
</test>
<test name="test2">
    <classes>
        <class name="ru.msk.tests.Test2"/> 
    </classes>
</test>
<test name="test3">
    <classes>
        <class name="ru.msk.tests.Test3"/> 
    </classes>
</test>

А вот в этом случае, все написанное выше будет применяться к каждой аннотации test, а порядок выполнения тестов будет такой как в xml.

Я имею ввиду, что такой вид записи

<test name="test1">
    <classes>
        <class name="ru.msk.tests.Test1"/> 
    </classes>
</test>
<test name="test2">
    <classes>
        <class name="ru.msk.tests.Test2"/> 
    </classes>
</test>

И такой вид записи

@Test(priority=1)
public class Test1{
}

@Test(priority=2)
public class Test2{
}

По сути одно и тоже? Только записано по разному.

Не совсем одно и тоже - просто дают одинаковую последовательность выполнения, а механизмы разные: первый через парсинг xml, второй через приоритеты.

спасибо

Хочу заметить, что такая конструкция применительно к классу у меня не работает!
Классы все равно запускаются не в порядке выставленного значения priority. Применительно к методам priority работает. Что странно, ведь в доке написано, что “Mark a class or a method as part of the test”. Кто-нибудь пробовал?

Покажите полный xml и версию TestNg

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite">
  <parameter name="configFile" value="application.properties"></parameter>
  <test verbose="1" name="Tests">
    <classes>
    
     <class name="ru.msk.Test1"/>  
     <class name="ru.msk.Test2"/>  
     <class name="ru.msk.Test3"/>  

    </classes>
  </test>
</suite>

У каждого класса Test* стоит аннотация

@Test(priority=*)

Версию testNG обновил до 6.8.6, ничего не изменилось.

  <test verbose="1" name="Tests" preserve-order="false">

Так тоже пробовал. preserve-order в данном случае не влияет.

1 лайк

Так действительно работает :slight_smile: А в моем проекте не работает.
Значит дело в чем-то еще… Какой-то еще параметр может влиять на работу testNG? Файлы testng.xml абсолютно идентичны, меняются только пути до классов.

Абсолютно аналогичная ситуация, и тоже без решения. Приходиться делать рефакторинг и переписывать тесты так что бы они были независимы. Это можно сделать но если придерживаться правил ООП займёт время.
Но сама ситуация когда у одного код работает как этого хотелось а у другого нет не даёт спокойно жить. Вопрос почему не работает ордеринг согласно xml остаётся