Удаленка для jenkins+selenide+selenoid+allure+docker спецов на 2-3 часа в день. 100% remote! Присоединиться к проекту

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

java
webdriver
testng
Теги: #<Tag:0x00007fedbf308e50> #<Tag:0x00007fedbf308d10> #<Tag:0x00007fedbf308ba8>

(Maxim) #1

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

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

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


Тесты проходят не по порядку Thucydides + JBehave + Maven
(vmaximv) #2

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


(Александр Таранков) #3

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

По умолчанию TestNG так и делает: тесты идут последовательно, как указано в конфиге. Методы внутри теста запускаются в алфавитном (вроде) порядке, считай не упорядочены. В документации http://testng.org/doc/documentation-main.html, сказано то же самое.

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

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

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


(Mykhailo Poliarush) #4

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


(Maxim) #5

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

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


(vmaximv) #6
@Test(priority=2)
public class Test1{
}

(Maxim) #7

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


(vmaximv) #8

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

<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.


(Maxim) #9

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

<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{
}

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


(vmaximv) #10

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


(Maxim) #11

спасибо


(Maxim) #12

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


(vmaximv) #13

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


(Maxim) #14
<?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, ничего не изменилось.


(vmaximv) #15
  <test verbose="1" name="Tests" preserve-order="false">

(Maxim) #16

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


(vmaximv) #17

(Maxim) #18

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


(Andrey Melnichenko) #19

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