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

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

selenium-grid
parallel
webdriver
Теги: #<Tag:0x00007f7b65a3a9e8> #<Tag:0x00007f7b65a3a8a8> #<Tag:0x00007f7b65a3a768>

(Alex Shats) #1

Кто пробавал такое реализовать на WebDriver получилось ли что то стабильно работающее?
Где то читал что такое возможно с WebDriver.
Стоит тратить на это время или бесполезно и единственное решение это запус максимум одного браузера на одной машине?
Какие варианты решения существуют?
п.с. В частности используя RemoteWebDriver.


Запуск теста одновременно на нескольких нодах
(Sergey Korol) #2

Selenium Grid + custom TestNG suites = стабильно работающее на разных окружениях при различном числе параллельных потоков. Плюсы очевидны.


(Alex Shats) #3

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


(Sergey Korol) #4

Вы можете запустить тесты и на одной машине, подняв хаб / ноды на локалхосте. Грид вас в этом не ограничит. Различные же вариации распараллеливания достигаются спец. параметрами TestNG. Вопрос в другом: осознаете ли вы последствия запуска тестов в параллели на одной машине? Речь ведь не о unit тестах, а о функциональных UI.


(Alex Shats) #5

Именно поэтому я и создал этот топик в данной секции форума - WebDriver.
Решение этой задачи насколько я понимаю не тривиально.


(babar.igor) #6

Однажды решали проблему просто - TestNG+Maven+Scheduler.
1.Создаем конфиг XML для TestNG с параметрами теста - входные данные, классы, методы для запуска.
2.Настраиваем Maven.
3.Создаем bat-файлы (sh - для Unix) для запуска теста с необх. конфигами.
Пример команды:

mvn clean test -DtestConfig="my_runners/test1_config.xml"

4.Ставим bat-файлы в расписание в каком-либо стандартном или нестандартном планировщике задач, или запускаем вручную.

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


(Sergey Korol) #7

Дело не в нетривиальности, а в нецелесообразности / порой и невозможности распараллеливания тестов на одной машине. Представьте, что у вас в требованиях прописана поддержка 10 различных конфигураций - ОС / браузер.

  1. Как вы собираетесь запускать тесты на других ОС, отличных о вашей?
  2. Как вы собираетесь запускать тесты на IE разных версий?
  3. Выдержит ли ваша машина запуск, к примеру, 10 FF?
  4. Не умрет ли хром драйвер от запуска множества инстансов?
  5. Не возникнут ли проблемы с производительностью? Ввиду того, что тесты пишутся / запускаются на той же машине. Будете закрывать все процессы?
  6. Сумеете ли вы обеспечить чистоту эксперимента на рабочей машине?
  7. Что, если, помимо драйвера, используются тулы, требующие видимости целевого сайта (к примеру, Sikuli)?
  8. Сможете ли однозначно ответить на вопрос, почему тесты падают случайным образом?
  9. Что если регрешен сьют экзекьюшен тайм будет занимать несколько часов? Будете сидеть и ждать, пока они завершатся, забыв о других тасках? Даже в случае ночного экзекьюшена, на утро то ведь все равно придется дебажить и перезапускать все.

Вообще говоря, запуск параллельных UI тестов на одной машине принесет вам больше головной боли, нежели профита.


(Alex Shats) #8

О чем и речь. Все что вы перчислили и являются возможными сложностями.
Какие то из пунктов не релевантны, а другие могут привести к нецелесообразности.
10 тестов одновременно скажем запускать не надо, но согласитесть что 4 или даже 2 очень даже сократять колличество необходимого времени для выполнения тестов.

Скажем есть 200 различных сценариев которые необходимо прогонять каждую регрессию.
Допустим прогоняются они на одной ОС и не важно на каком браузере.
Почему бы не запускать в одно время несколько таких тестов на одной машине.


(Dmitry Cheremushkin) #9

Есть успешный опыт.

В проекте используется связка Java + Maven + WebDriver + JBehave.
Последний позволяет пускать тесты в несколько потоков – как локально, так и в Grid.
На друг друга они не влияют. С RemoteWebDriver работает.
http://jbehave.org/reference/stable/multi-threading.html


(Sergey Korol) #10

Сложностей не будет в случае выделения дополнительных ресурсов. Собственно, внедрение автоматизации малыми усилиями является как минимум странным. Мы ведь не в эпоху становления компьютеров живем. И если вы действительно хотите получать хоть какой-то профит от автоматизации, то тут раритетами с 2Гб ОЗУ не обойтись. Можете так и передать своим кастомерам. Тут уже нужно отталкиваться от того, чего вы хотите добиться, зачем нужна автоматизация на вашем проекте…

Я понимаю, что мало кто захочет расставаться с лишними лицензиями на виртуалки, но даже с 2мя тестовыми ВМ на 4Гб ОЗУ вы начнете получать профит. А от одной рабочей тачки (на которой вы еще и девелопите), какой бы она не была крутой, - толку мало. Представьте еще, что завтра вам понадобится поднимать какой-нибудь CI или доп. клиент-серверные тулы… Тоже будете все это разворачивать на своем железе? Много ли у вас останется пространства для маневра?

Потому что вы еще не сталкивались со всеми прелестями работы драйвера при параллельном экзекьюшене на одной машине. Не усложняйте себе жизнь. Лучше приведите хорошие доводы вашим менеджерам, почему вам нужны еще несколько ВМ. Меньше нервов потратите, да и пользы будет больше. Сидеть молча, на все соглашаясь, - равносильно медленному выкапыванию глубокой ямы, из которой один путь - close automation.


(Dmitriy Zverev) #11

Если Вам нужна некая толика уверенности в том, что на это стоит потратить время, то подтверждаю: я потратил и оно работает.
Связка: Robot Framework + Jenkins + pabot.
Тем не менее, как следует из ответов выше, да и из опыта других тестировщиков - Вы можете упереться в совершенно неожиданные трудности.
Так или иначе всякий опыт полезен. Если попробуете, то напишите результаты, пожалуйста.


(vmaximv) #12

В контексте данного топика, это ключевой момент.


(Рома Иовлев) #13

Самый простой способ увеличить скорость в 2-4 раза (смотря сколько ядер у вас на машине):
Выставить этот флаг в решарпере. Больше чем там разрешено запускать не рекомендуется, так как если потоков больше чем ядер, то выгоды в производительности не будет.

P.S. Только надо быть уверенным в том, что тесты реально независимые и не мешают друг другу.


(Ruslan Semerenko) #14

Так же есть опыт запуска многопоточных тестов на связке Java + Maven + WebDriver + JBehave. Запускается 1 браузер на 1 ядро. Можно и по 1,5 браузера на ядро, но тогда процессор будет загружен на 100%. Плюс используется грид - 5 виртуалок по 4 ядра = 20 браузеров.
Стоит ли тратить на это время - однозначно стоит. В будущем это сэкономит время на ускорении прохождения тестов. У нас тесты проходят в один поток за 50 часов, на гриде - 3,5 часа.


(Alex Shats) #15

Кстати говоря о Grid. Я его еще фактически не знаю.
При работе с ним хаб тоже запускает тесты или он только перенаправляет на свободный нод?
По дефолту каждый нод гонит один тест?


(vmaximv) #16

Грид не параллелит тесты и тем более их не запускает - он играет роль пула доступных браузеров на нодах и транслятора хаб-нод. Число и виды доступных браузеров для каждой ноды можно устанавливать независимо. Запуск и параллелизация тестов лежит на “плечах” тестового фреймворка.


(Alex Shats) #17

Я имел ввиду что скажем есть у нас 1 сервер запущен как хаб, а так же еще несколько как ноды этого хаба. Так вот, при запуске нескольких тестов через RemoteWebDriver на один и тот же хаб одновременно, хаб распределит их по нодам.
Правильно я понимаю?


(vmaximv) #18

Райт. Хаб распределит нагрузку между нодами равномерно. Отдельный сервер на хаб - это перебор, от него нагрузка минимальна.


(Alex Shats) #19

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


(Sergey Korol) #20

Когда вы создаете инстанс RemoteWebDriver, то указываете URL, хаба, который может располагаться где угодно. Ноды же должны быть подняты там, где сами тесты будут выполняться. Нет никакой разницы, будет ли это машина с хабом или какая-то другая. Хаб с нодами общается по http.

Хаб ничего не запускает, вам уже несколько раз повторили. Для запуска тестов используются соответствующие фреймворки по типу TestNG, JUnit, etc. Хаб лишь направляет запросы нужному ноду. Представьте, что это диспетчер.