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

Параллельный запуск одинаковых тестов в Grid

reportng
framework
selenium-grid
parallel
testng
Теги: #<Tag:0x00007f7b625981b8> #<Tag:0x00007f7b62598028> #<Tag:0x00007f7b637d7108> #<Tag:0x00007f7b637d5218> #<Tag:0x00007f7b637d4bb0>

(Pnevmoslon) #1

Всем привет.

Есть задача: Написать фреймворк для тестирования, который позволит параллельно запускать тесты в разных браузерах. Только начинаю над этим работать поэтому хотелось бы, по возможности, наступить на чужие грабли :) А также услышать мнения о том, как лучше его реализовать.

Есть 4 сервера, на которых параллельно нужно запускать тесты:

 

Testserver 1   -     PC    -    Текущие версии браузеров(IE 9, Chrome 22, FF 15)
Testserver 2   -     PC    -    Предыдукущие версии браузеров(IE 8, Chrome 21, FF14)
Testserver 3   -     Mac    -    Текущие версии браузеров(Safari 6, Chrome 22, FF 15)
Testserver 4   -     Mac    -    Предыдукущие версии браузеро(Safari 5, Chrome 21, FF 14)
 
Никогда раньше не работал с гридом, поэтому, возможно, не так себе его представляю, но ситуация видится мне так:
1. Берём ещё один сервер, на который ставим grid hub
2. Запускаем на каждом из тестовы серверов grid node примерно со следующими настроками:
java -jar -Dwebdriver.chrome.driver=/path/to/driver selenium-server-standalone-2.25.0.jar -role node -port 5555 -hub http://10.1.99.1:4444/grid/register
-browser "browserName=internet explorer,version=9,platform=WINDOWS"
-browser "browserName=firefox, version=15,platform=WINDOWS"
-browser "browserName=chrome, version=22,platform=WINDOWS"
 
Дальше начинаются вопросы:
Каким образом реализовать их параллельный запуск используя TestNG и, если потребуется, Maven?
Не будет ли проблем с одновременным запуском(каких-либо нарушений в последовательности действий в тестах, создании помех друг другу)? Если да, то как это лучше решить.
Не будет ли проблем со сбором результатов выполнения тестов? Возможно есть какие-то готовые паттерны решения таких проблем(Для отчёности собираюсь использовать ReportNG)
Я так понимаю есть по крайней мере два варианта запуска тестов:
  • параллельно во всех браузерах на каждом из тестовых серверов(На тестовом сервере параллельно открываются три браузера и в них начинает пробегать каждый тест) - кажется ненадёжным
  • последовательно в каждом браузере для каждого сервера(В первом браузере проходить весь test suite, потом то же самое во втором, в третьем) - займёт больше времен

Какой из них лучше выбрать?

 


(Shaman) #2

для запуска при помощи тестНЖ я делал такой вот сьют файл:

<suite name="Paralel test" parallel="tests" thread-count="3" verbose="1">
 
  <test name="1 Parallel test" preserve-order="true">
       <parameter name="myparam" value="blabla"/>
       <classes>
             <class name="AccountCreation"/>
               <class name="collectInfo"/>
            <class name="addInfo"/>
          </classes>
  </test>

  <test name="2 Parallel test" preserve-order="true">
       <parameter name="myparam" value="blablablah"/>
       <classes>
             <class name="AccountCreation"/>
               <class name="collectInfo"/>
            <class name="addInfo"/>
          </classes>
  </test>

  <test name="3 Parallel test" preserve-order="true">
       <parameter name="myparam" value="blablablahblah"/>
       <classes>
             <class name="AccountCreation"/>
               <class name="collectInfo"/>
            <class name="addInfo"/>
          </classes>
  </test>

</suite>

нарушения последовательности тестов не должно быть если указать preserve-order="true", однако я столкнулся с проблемой передачи <parameter name="myparam" value="blabla"/> в каждый паралельный тест. он данное значение берет как-то рандомно, одно из трёх.


(Pnevmoslon) #3

Спасибо, именно так я и делаю. Теперь, правда, появилась идея запускать параллельно несколько сьюитов. И как-то не получается. 

Есть два сьюита примерно такого содержания:

 

 
<suite name="Tests in chrome" parallel="tests" thread-count="2">
    <test name="CS_001 in Chrome">
        <parameter name="browser" value="chrome"/>
        <classes>
            <class name="TestHarness.tests.CS_001"/>
        </classes>
    </test>
    <test name="CS_002 in Chrome">
        <parameter name="browser" value="chrome"/>
        <classes>
            <class name="TestHarness.tests.CS_002"/>
        </classes>
    </test>
</suite>
 
Второй такой же, только с фаерфоксом в качестве браузера.
По одному запускаются нормально, но когда указываю мэйвену запустить оба - оба и запускаются, но почему-то все тесты прходят только в фаерфоксе

(Shaman) #4

а вот это собственно проблема с которой и я столкнулся <parameter name="myparam" value="blabla"/> берется непойми как.


(Mykhailo Poliarush) #5

ответил сюда: Selenium RC/WebDriver - tests on IE in parallel


(Mykhailo Poliarush) #6

покажите, пожалуйста, как вы запускаете паралельно два пакета


(Pnevmoslon) #7

Спасибо, это вроде заработало :)

 


(Pnevmoslon) #8

 

<plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.11</version>
                <configuration>
                    <runOrder>alphabetical</runOrder>
                    <systemPropertyVariables>
                        <org.uncommons.reportng.escape-output>false</org.uncommons.reportng.escape-output>
                    </systemPropertyVariables>
                    <properties>
                        <suitethreadpoolsize>2</suitethreadpoolsize>
                        <property>
                            <name>usedefaultlisteners</name>
                            <value>false</value>
                        </property>
                        <property>
                            <name>listener</name>
                            <value>${report.listeners}</value>
                        </property>
                    </properties>
                    <workingDirectory>target/</workingDirectory>
                </configuration>
            </plugin>
 
и дальше в соответствующем профайле:
                        <configuration>
                            <parallel>true</parallel>
                            <suiteXmlFiles>
                                <suiteXmlFile>src/test/resources/ChromeSmokeTestSuite.xml</suiteXmlFile>
                                <suiteXmlFile>src/test/resources/FFSmokeTestSuite.xml</suiteXmlFile>
                            </suiteXmlFiles>
                        </configuration>
 
XML выглядят так:
<suite name="Tests in chrome" parallel="tests" thread-count="2">
    <test name="CS_001 in Chrome">
        <parameter name="browser" value="chrome"/>
        <parameter name="version" value="21"/>
        <classes>
            <class name="TestHarness.tests.CS_001"/>
        </classes>
    </test>
    <test name="CS_002 in Chrome">
        <parameter name="browser" value="chrome"/>
        <parameter name="version" value="21"/>
        <classes>
            <class name="TestHarness.tests.CS_002"/>
        </classes>
    </test>
</suite>

Запущен грид хаб и два нода. На одном фф 16, на другом - хром 21.

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


(Pnevmoslon) #9

Вопрос остаётся открытым. Кому-нибудь удавалось запустить параллельно два и более TestSuite'ов?


(Barry White) #10

Сконфигурировал параллельный запуск Webdriver тестов через TestNG +
https://github.com/barancev/webdriver-extensions/wiki

При запуске открывается нужное количество окон но в какой-то момент в одном из окон выполнение прекращается. Либо 1 тест не проходит в 1 окне, пока идут во 2-ом, потом 2 тест в 1-ом идёт нормального. Пробовал в FF, в Chrome.

Параллелизуются по tests либо по classes , инстанс браузера создаётся в @BeforeClass, дестроится в @AfterClass. thread-count ставлю 2.

В чём может быть причина наводок “двух” окон друг на друга? Куда есть смысл копать?

Можно ли с помощью Selenium Grid запустить несколько браузеров на одной ноде и добиться большей изолированности нескольких инстансов?

P.S. про Grid естественно в курсе, но быстро его заиспользовать не получится, поэтому было желание получить хоть какой-то профит во времени прогона на первых порах.
Спасибо.


(Sergey Korol) #11

Во-первых, без кода можно строить лишь догадки. Я вас конечно могу удивить, но большинство ошибок подобного рода возникают из-за неверной конфигурации. Во-вторых, идея запуска N тестов в N браузерах параллельно на локальной тачке - мне кажется абсурдной. По разным причинам… Прежде чем влазить в дебри масштабирования, для начала надо позаботиться об организации полноценной инфраструктуры, пригодной для подобного рода тестирования. Ваша автоматизация должна давать какой-то профит. И не вам лично, а членам всей команды. От того, что вы запустите тесты параллельно на рабочей виртуалке, полезнее ваша автоматизация не станет.


(Barry White) #12

Вопросов про организацию инфраструктуры и тестирования нет, где вы его увидели? И где вы увидели слова “локальный” и “рабочая машина”?

Вопрос был совершенно конкретный - могут ли тесты безопасно идти в разных окнах одного браузера на одной машине? Если нет - то вопрос снят. Если да - то я буду тратить дополнительное время на поиск ошибки и дебаг кода.

Вы говорите про неверную конфигурацию - что вы имеете ввиду? Тесты уже запускаются в разных потоках - выше я подробно описал, как это происходит. Если нужно больше информации и знаете какого рода - уточните, я допишу это в вопросе. Список проблем конфигураций ведь конечен.


(Sergey Korol) #13

Совершенно конкретный ответ - могут. Всегда ли, везде и при любых обстоятельствах? Нет.

Выше вы подробно исправили ваш пост только после моего сообщения. До этого ничего подробного он не содержал. Повторюсь еще раз: без кода никаких конкретных ответов вы никогда не получите. И никто не будет тратить время на угадывания, в чем же причина ваших сбоев, коих может быть достаточно много.


(James May) #14

я понимаю, что уже 3 года прошло, но может кто-нибудь это таки сделал? :smile:


(Sergey Korol) #15

Suites не параллелятся, это ограничение testng. Но вы можете сформировать xml с несколькими sub-suites. Да, они будут запускаться последовательно, но к примеру test блоки внутри каждого из них могут при этом запускаться параллельно.

Main suite:
Chrome sub-suite -> tests set for VM 1 / tests set for VM 2
IE sub-suite -> tests set for VM 1 / tests set for VM 2
FF sub-suite -> tests set for VM 1 / tests set for VM 2

(vmaximv) #16

А как жеж это:
http://testng.org/doc/documentation-main.html#parallel-suites


(James May) #17

сейчас так и сделал :slight_smile: Думал, может я упустил чего и подобная возможность уже появилась.
Т.к. как правильно утверждает @vmaximv, в документации появился пункт Parallel suites


(Sergey Korol) #18

Запуск из cmd это конечно хорошо, но я так понял, что речь шла об xml конфиге.


(James May) #19

да, я надеялся, что раз через cmd можно, то и через тот же pom разрешено


(Sergey Korol) #20

Ну технически оно должно было бы работать через pom, если бы не баг. И в 2.18.1 версии он все еще не пофикшен. Я не уверен правда, работало бы оно, если ему подсунуть 1 suite с набором sub-suites, ибо перечислять N suites в pom - не очень забавно. И это бы решило тогда проблему отсутствия возможности задания parallel=suites прямо из конфига.

П.С. Хотя, тут тоже не понятно, как оно будет себя вести, если задать parallel по suites + в самих suites еще параллелить. Лень проверять из cmd.