Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Selenium grid on-demand

524 views

Published on

Доклад Анастасии Асеевой на конференции SQA Days-21
www.sqadays.com

Published in: Education
  • Be the first to comment

  • Be the first to like this

Selenium grid on-demand

  1. 1. Rubber cluster for Selenium Grid
  2. 2. ‣ Создатель сообщества @qa_ru и @qa_jobs в Telegram ‣ В QA c 2012 года ‣ В IT с 2007 года ‣ Немного пишу код =) ‣ Люблю Linux ‣ Спикер на QAFest 2016 
 и XPDays 2016, TestCon 2017
  3. 3. Альфа Лаборатория
  4. 4. Конкуренция
  5. 5. Time to market Как уменьшить?
  6. 6. DevOps —> автоверификация ПО
  7. 7. Протестировать
  8. 8. Успеть за 30 минут:
  9. 9. ‣ Прогнать автотесты (регресс) Успеть за 30 минут:
  10. 10. ‣ Прогнать автотесты (регресс) ‣ Проанализировать результаты прогона автотестов Успеть за 30 минут:
  11. 11. ‣ Прогнать автотесты (регресс) ‣ Проанализировать результаты прогона автотестов ‣ Сделать приемочное тестирование Успеть за 30 минут:
  12. 12. Чтобы успеть за 30 минут, надо:
  13. 13. Чтобы успеть за 30 минут, надо: ‣ Ускорить прогон автотестов (до 10 минут)
  14. 14. Чтобы успеть за 30 минут, надо: ‣ Ускорить прогон автотестов (до 10 минут) ‣ Избавиться от очередей на запуск автотестов
  15. 15. Как ускорить прогон автотестов?
  16. 16. ‣ Залить проблему $ (купить еще железа) Как ускорить прогон автотестов?
  17. 17. ‣ Залить проблему $ (купить еще железа) ‣ Решить проблему инженерным способом Как ускорить прогон автотестов?
  18. 18. • Ускорить прогон тестов • Устранить очереди на запуск без привлечения $
  19. 19. As is: команды/проекты
  20. 20. ‣ Команды, выпускающие релизы от 3-5 раз в день As is: команды/проекты
  21. 21. ‣ Команды, выпускающие релизы от 3-5 раз в день ‣ Команды, выпускающие по 1 релизу раз в 1-2 недели As is: команды/проекты
  22. 22. ‣ Команды, выпускающие релизы от 3-5 раз в день ‣ Команды, выпускающие по 1 релизу раз в 1-2 недели ‣ 20 проектов с автотестами As is: команды/проекты
  23. 23. 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
  24. 24. 1 vm: конфигурация
  25. 25. 1 vm: конфигурация CI: Jenkins VM 1 • RAM 4 GB • 2 core • HDD 50 GB
  26. 26. 1 vm: конфигурация CI: Jenkins VM 1 • RAM 4 GB • 2 core • HDD 50 GB ОС: windows
  27. 27. CI: Jenkins 1 vm = 2 потока с автотестами VM 1
  28. 28. 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
  29. 29. 1 проект с автотестами - это:
  30. 30. ‣ от 30 до 70 тестов 1 проект с автотестами - это:
  31. 31. ‣ от 30 до 70 тестов ‣ Запуск тестов в 1 поток = 30 минут 1 проект с автотестами - это:
  32. 32. ‣ от 30 до 70 тестов ‣ Запуск тестов в 1 поток = 30 минут ‣ Запуск тестов в 3 потока = 10 минут 1 проект с автотестами - это:
  33. 33. ‣ от 30 до 70 тестов ‣ Запуск тестов в 1 поток = 30 минут ‣ Запуск тестов в 3 потока = 10 минут ‣ На практике от 5 до 10 потоков 1 проект с автотестами - это:
  34. 34. Запуск 20 проектов - это:
  35. 35. ‣ 60 сессий с тестами Запуск 20 проектов - это:
  36. 36. ‣ 60 сессий с тестами ‣ 15 vm = 30 сессий Запуск 20 проектов - это:
  37. 37. ‣ 60 сессий с тестами ‣ 15 vm = 30 сессий ‣ 30 сессий отправятся в очередь Запуск 20 проектов - это:
  38. 38. 30 сессий в очереди
  39. 39. Virtual machines Docker 30 сессий 15 машин = 60 Gb RAM / 30 Cores 500 Mb RAM на 1 контейнерvs 120 сессий 15 машин 2 сессии в машине
  40. 40. Virtual machines Docker 30 сессий 15 машин = 60 Gb RAM / 30 Cores 500 Mb RAM на 1 контейнерvs 120 сессий 15 машин 2 сессии в машине
  41. 41. Virtual machines Docker 30 сессий vs 15 машин 2 сессии в машине
  42. 42. Virtual machines Docker 30 сессий 15 машин = 60 Gb RAM / 30 Cores vs 15 машин 2 сессии в машине
  43. 43. Virtual machines Docker 30 сессий 15 машин = 60 Gb RAM / 30 Cores 500 Mb RAM на 1 контейнерvs 15 машин 2 сессии в машине
  44. 44. Virtual machines Docker 30 сессий 15 машин = 60 Gb RAM / 30 Cores 500 Mb RAM на 1 контейнерvs 120 сессий 15 машин 2 сессии в машине
  45. 45. ‣ Динамическая песочница
  46. 46. ‣ Динамическая песочница
  47. 47. ‣ Динамическая песочница ‣ Оркестратор тестов
  48. 48. Динамическая песочница
  49. 49. Host 1 Host 2 Host 5 Host 3 Host 4 Host 6 Host 7
  50. 50. Host 1 Host 2 Host 5 Host 3 Host 4 Host 6 Host 7 Computational cluster
  51. 51. Host 1 Host 2 Host 5 Host 3 Host 4 Host 6 Host 7 Computational cluster API
  52. 52. Computational cluster API Apache
 Mesos Mesosphere
 Marathon
  53. 53. Параллелизация
  54. 54. Оркестраторы тестов
  55. 55. ‣ Jenkins Оркестраторы тестов
  56. 56. ‣ Jenkins ‣ Selenium grid Оркестраторы тестов
  57. 57. Selenium grid спешит на помощь
  58. 58. Hub
  59. 59. Node 2 Hub Node 5 Node 4 Node 1 Node 3 Node 7 Node 6 Node 9 Node 8
  60. 60. Node 2 Hub Node 5 Node 4 Node 1 Node 3 Node 7 Node 6 Node 9 Node 8
  61. 61. Node 2 Hub Node 5 Node 4 Node 1 Node 3 Node 7 Node 6 Node 9 Node 8
  62. 62. Node 2 Hub Node 5 Node 4 Node 1 Node 3 Node 7 Node 6 Node 9 Node 8
  63. 63. Quick start selenium grid
  64. 64. Host 1
  65. 65. Host 1
  66. 66. Selenium Standalone Server
 .jar file = Host 1
  67. 67. Host 1
  68. 68. Host 1
  69. 69. $ java -jar selenium-server-standalone.jar 
 -role hub Host 1
  70. 70. $ java -jar selenium-server-standalone.jar 
 -role hub Hub
 process Host 1
  71. 71. Hub
 process Host 1
  72. 72. Hub
 process Host 1 Host 2
  73. 73. Hub
 process Host 1 Host 2
  74. 74. Hub
 process Host 1 Host 2
  75. 75. Host 2
  76. 76. $ java -jar selenium-server-standalone.jar 
 -role node 
 -hub http://host1:4444/grid/register Host 2
  77. 77. Node
 process $ java -jar selenium-server-standalone.jar 
 -role node 
 -hub http://host1:4444/grid/register Host 2
  78. 78. Node
 process Host 2
  79. 79. Hub
 process Host 2 Node
 process Host 1
  80. 80. Hub
 process Host 2 Node
 process Host 1
  81. 81. Момент из жизни ноды
  82. 82. Момент из жизни ноды Hub Node
  83. 83. Момент из жизни ноды Hub Node Привет! Хочешь пообщаться? Я тут: Host: 192.168.1.5 Port: 5555 А еще я дружу с Chrome!
  84. 84. Момент из жизни ноды Hub Node Привет! Хочешь пообщаться? Я тут: Host: 192.168.1.5 Port: 5555 А еще я дружу с Chrome! Ага! На,
 потестируй-ка!
  85. 85. Хаб ‣ Принимает запросы с тестами ‣ Распределяет между нодами
  86. 86. Старт грида в docker- контейнерах
  87. 87. Внутри контейнера с нодой /opt/selenium$ ls chromedriver-2.29 selenium-server-standalone.jar config.json
  88. 88. config.json echo " { "capabilities": [ { "version": "$CHROME_VERSION", … } ], "maxSession": $NODE_MAX_SESSION, "port": $NODE_PORT, … }"
  89. 89. 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} &
  90. 90. Запуск контейнера с нодой $ docker run selenium/node-chrome -e HUB_HOST=192.168.1.5 -e HUB_PORT=4444
  91. 91. Проблемы статических гридов ‣ Деградация нод ‣ Постоянно занимают место
  92. 92. Pipeline job autotests
  93. 93. Pipeline job autotests Jenkins: Job1
  94. 94. Pipeline job autotests cli Number Of Containers Jenkins: Job1
  95. 95. Pipeline job autotests cli Number Of Containers Jenkins: Job1 cli Create Selenium Grid
  96. 96. Pipeline job autotests cli Number Of Containers Jenkins: Job1 cli Create Selenium Grid run AutotestsProject
  97. 97. Pipeline job autotests cli Number Of Containers Selenium Hub Jenkins: Job1 cli Create Selenium Grid run AutotestsProject
  98. 98. 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
  99. 99. 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
  100. 100. 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
  101. 101. Автоматизация
  102. 102. Автоматизация ‣ Вычисления требуемого количества node
  103. 103. Автоматизация ‣ Вычисления требуемого количества node ‣ Получения динамического адреса hub
  104. 104. $ $ ansible-playbook -i inventory play-site.yml -e test_id=mytest -e nodes_type=chrome -e nodes_count=4
  105. 105. $ docker run -p 6666:5555 selenium/node-chrome
  106. 106. $ docker run -p 6666:5555 selenium/node-chrome
  107. 107. $ docker run -p 6666:5555 selenium/node-chrome
  108. 108. Docker container Selenium
 Node 6666 5555
  109. 109. Docker container Selenium
 Node 6666 5555
  110. 110. Host with Mesos Ports to use: 
 20000 … 21000
  111. 111. $ docker run 
 -p <?>:5555 
 selenium/node-chrome Host with Mesos Ports to use: 
 20000 … 21000
  112. 112. $ docker run 
 -p 20856:5555 
 selenium/node-chrome Host with Mesos Ports to use: 
 20000 … 21000
  113. 113. $ docker run 
 -p 20856:5555 
 selenium/node-chrome Host with Mesos Ports to use: 
 20000 … 21000
  114. 114. Selenium Node в Mesos ‣ Поднимается на случайном хосте ‣ Получает случайный порт
  115. 115. 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
  116. 116. Hub Node
  117. 117. Hub Node Привет! Хочешь пообщаться? Я тут: Host: 172.17.0.2 Port: 5555
  118. 118. Hub Node Привет! Хочешь пообщаться? Я тут: Host: 172.17.0.2 Port: 5555 Хах, но на самом деле… Host: 192.168.1.5 Port: 20345
  119. 119. Hub Node Привет! Хочешь пообщаться? Я тут: Host: 172.17.0.2 Port: 5555 Хах, но на самом деле… Host: 192.168.1.5 Port: 20345 Ты меня обманула!
  120. 120. Docker host network Docker container Selenium Node 20345
  121. 121. Docker host network Docker container Selenium Node 20345 X virtual framebuffer ‣ Ему нужен порт ‣ А он уже занят 
 другим контейнером!
  122. 122. 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
  123. 123. Selenium Node config { … "host": "$HOST", … }
  124. 124. Selenium Node config { … "host": "$HOST", "port": "$PORT0", … }
  125. 125. Docker bridged network Docker container Selenium
 Node 20345 5555 $ docker run 
 -p 20345:5555 
 selenium/node-chrome
  126. 126. Docker bridged network Docker container Selenium
 Node 20345 5555 $ docker run 
 -p 20345:5555 -port 20345 
 selenium/node-chrome
  127. 127. Docker bridged network Docker container Selenium
 Node 20345 20345 $ docker run 
 -p 20345:5555 -port 20345 
 selenium/node-chrome
  128. 128. Docker bridged network Docker container Selenium
 Node 20345 20345 $ docker run 
 -p 20345:5555 -port 20345 
 selenium/node-chrome
  129. 129. Docker bridged network Docker container Selenium
 Node 20345 20345 $ docker run 
 -p 20345:5555 -port 20345 
 selenium/node-chrome
  130. 130. Порт порту - рознь! ‣ Порт, на котором поднимается нода ‣ Порт, который нода сообщает хабу
  131. 131. advertisePort parameter @Parameter(names = "-advertisePort") public Integer advertisePort;
  132. 132. Give it to Hub! if (advertisePort != null) { myPort = advertisePort; }
  133. 133. В итоге
  134. 134. В итоге • Кластер, в котором создаются докер- контейнеры
  135. 135. В итоге • Кластер, в котором создаются докер- контейнеры • Selenium grid как приложение
  136. 136. В итоге • Кластер, в котором создаются докер- контейнеры • Selenium grid как приложение • Jenkins
  137. 137. В итоге • Кластер, в котором создаются докер- контейнеры • Selenium grid как приложение • Jenkins • Cкрипты, которые автоматизируют какую-то работу
  138. 138. Вывод Используйте 
 динамическое управление ресурсами, 
 а не статическое
  139. 139. Мои контакты: @travieso_nastya traviesonastya anastasia.aseeva
  140. 140. А еще: @qa_ru @qa_jobs

×