Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare a Scribd company logo
Rubber cluster for
Selenium Grid
‣ Создатель сообщества @qa_ru и
@qa_jobs в Telegram
‣ В QA c 2012 года
‣ В IT с 2007 года
‣ Немного пишу код =)
‣ Люблю Linux
‣ Спикер на QAFest 2016 

и XPDays 2016, TestCon 2017
Альфа
Лаборатория
Selenium grid on-demand
Конкуренция
Time to market
Как уменьшить?
Selenium grid on-demand
DevOps —>
автоверификация ПО
Протестировать
Успеть за 30 минут:
‣ Прогнать автотесты (регресс)
Успеть за 30 минут:
‣ Прогнать автотесты (регресс)
‣ Проанализировать результаты
прогона автотестов
Успеть за 30 минут:
‣ Прогнать автотесты (регресс)
‣ Проанализировать результаты
прогона автотестов
‣ Сделать приемочное тестирование
Успеть за 30 минут:
Чтобы успеть за 30 минут, надо:
Чтобы успеть за 30 минут, надо:
‣ Ускорить прогон автотестов (до 10 минут)
Чтобы успеть за 30 минут, надо:
‣ Ускорить прогон автотестов (до 10 минут)
‣ Избавиться от очередей на запуск автотестов
Как ускорить прогон автотестов?
‣ Залить проблему $ (купить еще
железа)
Как ускорить прогон автотестов?
‣ Залить проблему $ (купить еще
железа)
‣ Решить проблему инженерным
способом
Как ускорить прогон автотестов?
• Ускорить прогон тестов
• Устранить очереди на запуск
без привлечения $
As is: команды/проекты
‣ Команды, выпускающие релизы от
3-5 раз в день
As is: команды/проекты
‣ Команды, выпускающие релизы от
3-5 раз в день
‣ Команды, выпускающие по 1
релизу раз в 1-2 недели
As is: команды/проекты
‣ Команды, выпускающие релизы от
3-5 раз в день
‣ Команды, выпускающие по 1
релизу раз в 1-2 недели
‣ 20 проектов с автотестами
As is: команды/проекты
CI: Jenkins
VM7
VM 12
VM 2
VM 8
VM 13
VM 3
VM 6
As is:
VM 11
VM 1
VM 9
VM 14
VM 4
VM 10
VM 15
VM 5
1 vm: конфигурация
1 vm: конфигурация
CI: Jenkins
VM 1
• RAM 4 GB
• 2 core
• HDD 50 GB
1 vm: конфигурация
CI: Jenkins
VM 1
• RAM 4 GB
• 2 core
• HDD 50 GB
ОС: windows
CI: Jenkins
1 vm = 2 потока с автотестами
VM 1
CI: Jenkins
VM 2 VM 3VM 1 VM 4 VM 5
As is:
VM7 VM 8VM 6 VM 9 VM 10
VM 12 VM 13VM 11 VM 14 VM 15
ДЦ1
ДЦ2
ДЦ3
1 проект с
автотестами -
это:
‣ от 30 до 70 тестов
1 проект с
автотестами -
это:
‣ от 30 до 70 тестов
‣ Запуск тестов в 1 поток = 30 минут
1 проект с
автотестами -
это:
‣ от 30 до 70 тестов
‣ Запуск тестов в 1 поток = 30 минут
‣ Запуск тестов в 3 потока = 10
минут
1 проект с
автотестами -
это:
‣ от 30 до 70 тестов
‣ Запуск тестов в 1 поток = 30 минут
‣ Запуск тестов в 3 потока = 10
минут
‣ На практике от 5 до 10 потоков
1 проект с
автотестами -
это:
Запуск 20
проектов -
это:
‣ 60 сессий с тестами
Запуск 20
проектов -
это:
‣ 60 сессий с тестами
‣ 15 vm = 30 сессий
Запуск 20
проектов -
это:
‣ 60 сессий с тестами
‣ 15 vm = 30 сессий
‣ 30 сессий отправятся в очередь
Запуск 20
проектов -
это:
30 сессий в очереди
Virtual machines Docker
30 сессий
15 машин = 60 Gb RAM / 30 Cores
500 Mb RAM на 1 контейнерvs
120 сессий
15 машин
2 сессии в машине
Virtual machines Docker
30 сессий
15 машин = 60 Gb RAM / 30 Cores
500 Mb RAM на 1 контейнерvs
120 сессий
15 машин
2 сессии в машине
Virtual machines Docker
30 сессий
vs
15 машин
2 сессии в машине
Virtual machines Docker
30 сессий
15 машин = 60 Gb RAM / 30 Cores
vs
15 машин
2 сессии в машине
Virtual machines Docker
30 сессий
15 машин = 60 Gb RAM / 30 Cores
500 Mb RAM на 1 контейнерvs
15 машин
2 сессии в машине
Virtual machines Docker
30 сессий
15 машин = 60 Gb RAM / 30 Cores
500 Mb RAM на 1 контейнерvs
120 сессий
15 машин
2 сессии в машине
Selenium grid on-demand
‣ Динамическая песочница
‣ Динамическая песочница
‣ Динамическая песочница
‣ Оркестратор тестов
Динамическая песочница
Host 1
Host 2
Host 5
Host 3
Host 4
Host 6
Host 7
Host 1
Host 2
Host 5
Host 3
Host 4
Host 6
Host 7
Computational cluster
Host 1
Host 2
Host 5
Host 3
Host 4
Host 6
Host 7
Computational cluster
API
Computational cluster
API
Apache

Mesos
Mesosphere

Marathon
Параллелизация
Оркестраторы тестов
‣ Jenkins
Оркестраторы тестов
‣ Jenkins
‣ Selenium grid
Оркестраторы тестов
Selenium grid
спешит на помощь
Selenium grid on-demand
Hub
Node 2
Hub
Node 5
Node 4
Node 1
Node 3
Node 7
Node 6
Node 9
Node 8
Node 2
Hub
Node 5
Node 4
Node 1
Node 3
Node 7
Node 6
Node 9
Node 8
Node 2
Hub
Node 5
Node 4
Node 1
Node 3
Node 7
Node 6
Node 9
Node 8
Node 2
Hub
Node 5
Node 4
Node 1
Node 3
Node 7
Node 6
Node 9
Node 8
Quick start selenium
grid
Host 1
Host 1
Selenium Standalone Server

.jar file
=
Host 1
Host 1
Host 1
$ java 
-jar selenium-server-standalone.jar  

-role hub
Host 1
$ java 
-jar selenium-server-standalone.jar  

-role hub
Hub

process
Host 1
Hub

process
Host 1
Hub

process
Host 1 Host 2
Hub

process
Host 1 Host 2
Hub

process
Host 1 Host 2
Host 2
$ java 
-jar selenium-server-standalone.jar  

-role node 

-hub http://host1:4444/grid/register
Host 2
Node

process
$ java 
-jar selenium-server-standalone.jar  

-role node 

-hub http://host1:4444/grid/register
Host 2
Node

process
Host 2
Hub

process
Host 2
Node

process
Host 1
Hub

process
Host 2
Node

process
Host 1
Момент из жизни ноды
Момент из жизни ноды
Hub
Node
Момент из жизни ноды
Hub
Node
Привет! Хочешь пообщаться? Я тут:
Host: 192.168.1.5
Port: 5555
А еще я дружу с Chrome!
Момент из жизни ноды
Hub
Node
Привет! Хочешь пообщаться? Я тут:
Host: 192.168.1.5
Port: 5555
А еще я дружу с Chrome!
Ага! На,

потестируй-ка!
Хаб
‣ Принимает запросы с тестами
‣ Распределяет между нодами
Старт грида в docker-
контейнерах
Внутри контейнера с нодой
/opt/selenium$ ls
chromedriver-2.29
selenium-server-standalone.jar
config.json
config.json
echo "
{
"capabilities": [
{
"version": "$CHROME_VERSION",
…
}
],
"maxSession": $NODE_MAX_SESSION,
"port": $NODE_PORT,
…
}"
entry_point.sh
java ${JAVA_OPTS} -jar /opt/selenium/selenium-server-standalone.jar 
-role node 
-hub http://$HUB_HOST:$HUB_PORT/grid/register 
-nodeConfig /opt/selenium/config.json 
${SE_OPTS} &
Запуск контейнера с нодой
$ docker run selenium/node-chrome 
-e HUB_HOST=192.168.1.5 
-e HUB_PORT=4444
Проблемы статических гридов
‣ Деградация нод
‣ Постоянно занимают место
Pipeline job autotests
Pipeline job autotests
Jenkins: Job1
Pipeline job autotests
cli Number Of
Containers
Jenkins: Job1
Pipeline job autotests
cli Number Of
Containers
Jenkins: Job1
cli Create
Selenium Grid
Pipeline job autotests
cli Number Of
Containers
Jenkins: Job1
cli Create
Selenium Grid
run
AutotestsProject
Pipeline job autotests
cli Number Of
Containers
Selenium
Hub
Jenkins: Job1
cli Create
Selenium Grid
run
AutotestsProject
Pipeline job autotests
cli Number Of
Containers
Selenium
Hub
Selenium
chrome
node
Selenium
firefox
node
Selenium
chrome
node
Selenium
firefox
node
Selenium Grid
Hub, node запущены
в docker-контейнерах
Jenkins: Job1
cli Create
Selenium Grid
run
AutotestsProject
Pipeline job autotests
cli Number Of
Containers
Selenium
Hub
Mesos
master
marathon
REST API
Selenium
chrome
node
Selenium
firefox
node
Selenium
chrome
node
Selenium
firefox
node
Selenium Grid
Hub, node запущены
в docker-контейнерах
Jenkins: Job1
cli Create
Selenium Grid
run
AutotestsProject
Pipeline job autotests
cli Number Of
Containers
Selenium
Hub
Mesos
master
marathon
REST API
Selenium
chrome
node
Selenium
firefox
node
Selenium
chrome
node
Selenium
firefox
node
Selenium Grid
Hub, node запущены
в docker-контейнерах
Jenkins: Job1
cli Delete
Selenium Grid
cli Create
Selenium Grid
run
AutotestsProject
Автоматизация
Автоматизация
‣ Вычисления требуемого количества node
Автоматизация
‣ Вычисления требуемого количества node
‣ Получения динамического адреса hub
Selenium grid on-demand
$ $ ansible-playbook -i inventory play-site.yml 
-e test_id=mytest 
-e nodes_type=chrome 
-e nodes_count=4
$ docker run -p 6666:5555 selenium/node-chrome
$ docker run -p 6666:5555 selenium/node-chrome
$ docker run -p 6666:5555 selenium/node-chrome
Docker container
Selenium

Node
6666
5555
Docker container
Selenium

Node
6666
5555
Host with Mesos
Ports to use:


20000
…
21000
$ docker run 

-p <?>:5555 

selenium/node-chrome
Host with Mesos
Ports to use:


20000
…
21000
$ docker run 

-p 20856:5555 

selenium/node-chrome
Host with Mesos
Ports to use:


20000
…
21000
$ docker run 

-p 20856:5555 

selenium/node-chrome
Host with Mesos
Ports to use:


20000
…
21000
Selenium Node в Mesos
‣ Поднимается на случайном хосте
‣ Получает случайный порт
Docker bridged network
Docker container
Selenium

Node
20345
5555
Reality
Host: 192.168.1.5
Port: 20345
From view of Node
Host: 172.17.0.2
Port: 5555
Selenium grid on-demand
Hub
Node
Hub
Node
Привет! Хочешь пообщаться? Я тут:
Host: 172.17.0.2
Port: 5555
Hub
Node
Привет! Хочешь пообщаться? Я тут:
Host: 172.17.0.2
Port: 5555
Хах, но на самом деле…
Host: 192.168.1.5
Port: 20345
Hub
Node
Привет! Хочешь пообщаться? Я тут:
Host: 172.17.0.2
Port: 5555
Хах, но на самом деле…
Host: 192.168.1.5
Port: 20345
Ты меня обманула!
Docker host network
Docker container
Selenium Node
20345
Docker host network
Docker container
Selenium Node
20345
X virtual framebuffer
‣ Ему нужен порт
‣ А он уже занят 

другим контейнером!
Docker bridged network
Docker container
Selenium

Node
20345
5555
Docker environment
$HOST: 192.168.1.5
$PORT0: 20345
Reality
Host: 192.168.1.5
Port: 20345
Selenium Node config
{
…
"host": "$HOST",
…
}
Selenium Node config
{
…
"host": "$HOST",
"port": "$PORT0",
…
}
Docker bridged network
Docker container
Selenium

Node
20345
5555 $ docker run 

-p 20345:5555 

selenium/node-chrome
Docker bridged network
Docker container
Selenium

Node
20345
5555 $ docker run 

-p 20345:5555 
-port 20345 

selenium/node-chrome
Docker bridged network
Docker container
Selenium

Node
20345
20345 $ docker run 

-p 20345:5555 
-port 20345 

selenium/node-chrome
Docker bridged network
Docker container
Selenium

Node
20345
20345 $ docker run 

-p 20345:5555 
-port 20345 

selenium/node-chrome
Docker bridged network
Docker container
Selenium

Node
20345
20345 $ docker run 

-p 20345:5555 
-port 20345 

selenium/node-chrome
Порт порту - рознь!
‣ Порт, на котором поднимается нода
‣ Порт, который нода сообщает хабу
advertisePort parameter
@Parameter(names = "-advertisePort")
public Integer advertisePort;
Give it to Hub!
if (advertisePort != null) {
myPort = advertisePort;
}
В итоге
В итоге
• Кластер, в котором создаются докер-
контейнеры
В итоге
• Кластер, в котором создаются докер-
контейнеры
• Selenium grid как приложение
В итоге
• Кластер, в котором создаются докер-
контейнеры
• Selenium grid как приложение
• Jenkins
В итоге
• Кластер, в котором создаются докер-
контейнеры
• Selenium grid как приложение
• Jenkins
• Cкрипты, которые автоматизируют какую-то
работу
Вывод
Используйте 

динамическое управление ресурсами, 

а не статическое
Мои контакты:
@travieso_nastya
traviesonastya
anastasia.aseeva
А еще:
@qa_ru
@qa_jobs

More Related Content

Selenium grid on-demand