CodeFest 2019. Роман Иваницкий (Одноклассники) — Масштабирование андроид-тестирования в Одноклассниках

16b6c87229eaf58768d25ed7b2bbbf52?s=47 CodeFest
April 06, 2019

CodeFest 2019. Роман Иваницкий (Одноклассники) — Масштабирование андроид-тестирования в Одноклассниках

История развития селениум-инфраструктуры, масштабирование фермы для андроид-тестирования и объединение её с существующей инфраструктурой, или как мы пришли к запуску всех тестов на каждый PR.

16b6c87229eaf58768d25ed7b2bbbf52?s=128

CodeFest

April 06, 2019
Tweet

Transcript

  1. Масштабирование андроид тестирования в ok.ru Роман Иваницкий Инженер Одноклассники

  2. План • Selenium инфраструктура • Android инфраструктура • Процесс разработки

    • Итоги 2
  3. 1. Selenium 3

  4. 2012, odnoklassniki.ru • Рост пользователей • Тестирование происходит вручную •

    Регресс занимает много времени • Хочется релизить чаще 4
  5. 2012, odnoklassniki.ru • Рост пользователей • Тестирование происходит вручную •

    Регресс занимает много времени • Хочется релизить чаще 5
  6. 2012, odnoklassniki.ru • Рост пользователей • Тестирование происходит вручную •

    Регресс занимает много времени • Хочется релизить чаще 6
  7. 2012, odnoklassniki.ru • Рост пользователей • Тестирование происходит вручную •

    Регресс занимает много времени • Хочется релизить чаще 7
  8. 2012, odnoklassniki.ru Нужна команда автоматизации тестирования! 8

  9. 2012-2015, selenium grid Hub Node 1 VM Node 2 Node

    N 9
  10. 2015, selenium grid • Количество тестов выросло >1000 • Количество

    запусков выросло • Масштабировать стало сложно • Вспомогательные сервисы 10
  11. 2015, selenium grid Hub Node 1 VM Node 2 Node

    N 11
  12. 2015, selenium grid Hub Node 1 VM Node 2 Node

    N N=>200 12
  13. 2015, selenium grid Hub Node 1 VM Node 2 Node

    N N=>200 https://goo.gl/Do2SVV 13
  14. Проблема масштабирования 14

  15. Требования • Масштабируемость • Стабильность • Отказоустойчивость 15

  16. Требования • Масштабируемость • Стабильность • Отказоустойчивость 16

  17. Требования • Масштабируемость • Стабильность • Отказоустойчивость 17

  18. Требования • Масштабируемость • Стабильность • Отказоустойчивость https://goo.gl/Y5wQGs 18

  19. 2015-сейчас, свой selenium-grid 19 Coordinator HW HW HW NodeManager HW

    NodeManager HW NodeManager HW DB
  20. Coordinator - брокер ресурсов • Знает топологию кластера • Принимает

    заявки на ресурсы • Приоритезирует заявки • Мониторит состояние нод • Хранит информацию в БД • Объединяет ноды в сервисы/фермы 20
  21. Coordinator фермы 21

  22. Coordinator фермы 22

  23. Coordinator сервисы 23

  24. Coordinator API 24

  25. Nodemanager - resource node • Получает задачи на координаторе •

    Запускает ресурсы по требованию 25
  26. Nodemanager - resource node • Каждый запуск изолирован • В

    качестве ответа host + ports ◦ http://srv666:4444 26
  27. Nodemanager Nodemanager fake1@centos fake2@centos fake3@centos root@centos 27

  28. Test sequence 28

  29. Request resource 29

  30. Nodemanager get job 30

  31. Nodemanager get job 31

  32. Nodemanager get job 32

  33. Nodemanager start resource 33

  34. Nodemanager start resource 34

  35. Nodemanager commit result 35

  36. Coordinator return result 36

  37. Test run 37

  38. Масштабирование 38 NodeManager HW NodeManager HW NodeManager HW NodeManager HW

    NodeManager HW NodeManager HW NodeManager HW NodeManager HW NodeManager HW NodeManager HW NodeManager NodeManager DC1 DC2 DC3 HW 800+ браузеров одновременно
  39. Отказоустойчивость 39 Coordinator Coordinator DNS failover coordinator.at.ok.ru Primary Secondary

  40. Grid Coordinator NodeManager HW NodeManager HW NodeManager HW Coordinator DNS

    failover NodeManager HW NodeManager HW NodeManager HW NodeManager HW NodeManager HW NodeManager HW NodeManager HW NodeManager NodeManager DC1 DC2 DC3 HW 40
  41. 2. Android 41

  42. Тестовые фреймворки • WebDriver way ◦ selendroid ◦ appium •

    Native way ◦ robotium ◦ ui-automator ◦ espresso 42
  43. Native tests vs WebDriver tests + Получение девайса = получение

    браузера - install App APK + install Test APK - Нужно забирать артефакты с девайсов - Тесты бегают на самом устройстве 43
  44. Native tests vs WebDriver tests + Получение девайса = получение

    браузера - install App APK + install Test APK - Нужно забирать артефакты с девайсов - Тесты бегают на самом устройстве 44
  45. Native tests vs WebDriver tests + Получение девайса = получение

    браузера - install App APK + install Test APK - Нужно забирать артефакты с девайсов - Тесты бегают на самом устройстве 45
  46. Native tests vs WebDriver tests + Получение девайса = получение

    браузера - install App APK + install Test APK - Нужно забирать артефакты с девайсов - Тесты бегают на самом устройстве 46
  47. Native tests vs WebDriver tests + Получение девайса = получение

    браузера - install App APK + install Test APK - Нужно забирать артефакты с девайсов - Тесты бегают на самом устройстве 47
  48. 2015, Первые андроид тесты Linux host 48

  49. 2016, Рост тестов и девайсов DeviceManager CI jadb ADB Client

    in pure Java. 49
  50. 2016, DeviceManager first API 50

  51. Изоляция adb ADB ADB 51

  52. Андроид ферма готова 52

  53. Реальное устройство 53

  54. Эмулятор 54

  55. Эмулятор • Хорошо масштабируются • Не умирают со временем •

    У нас нет hardware-specific фич • Легко обновлять версии • Работают достаточно быстро • Есть уже работающая инфраструктура 55
  56. Nodemanager + Android Nodemanager fake2@centos fake3@centos root@centos 56

  57. Create AVD avdmanager create avd -n “test” -k "$EMULATOR_IMAGE" --abi

    "google_apis/x86" --device "$ANDROID_DEVICE" --sdcard /sdcard.img 57
  58. Nodemanager + Android emulator -avd test -verbose -ports ${CONSOLE},${ADB} -gpu

    ${TYPE} -no-window -qemu -enable-kvm 58
  59. Nodemanager + Android emulator -avd test -verbose -ports ${CONSOLE},${ADB} -gpu

    ${TYPE} -no-window -qemu -enable-kvm One instance of a particular AVD at a time 59
  60. Nodemanager + Android emulator -avd test -verbose -read-only #since Emulator

    28.0.16 -ports ${CONSOLE},${ADB} -gpu ${TYPE} -no-window -qemu -enable-kvm 60
  61. Emulator performance • Fast x86 or x86_64 emulators with hardware

    acceleration ◦ /dev/kvm on linux ◦ Intel CPU and Intel HAXM driver for Win, Mac • GPU emulation ◦ host ◦ swiftshader_indirect • Snapshots for fast boot 61
  62. Network redirection redir --laddr=${IP} --lport=${ADB} --caddr=127.0.0.1 --cport=${ADB} 62

  63. Docker android images • https://github.com/appium/appium-docker-android • https://github.com/budtmo/docker-android • https://github.com/agoda-com/docker-emulator-android •

    https://github.com/aerokube/selenoid-images 63
  64. Эмуляторы в one-cloud Coordinator HW HW HW CloudManager HW NodeManager

    HW NodeManager HW one-cloud
  65. 2017, DeviceManager + Coordinator DeviceManager Coordinator Nodemanager 65

  66. 2017, DeviceManager API 66

  67. adb install on 250 emulators 67

  68. DM + Coordinator = Success? • Масштабирование устройств • Запуск

    на каждый PR • Разработчик быстро получает результаты 68
  69. DM + Coordinator = Success? • Масштабирование устройств • Запуск

    на каждый PR • Разработчик быстро получает результаты 69
  70. DM + Coordinator = Success? • Масштабирование устройств • Запуск

    на каждый PR • Разработчик быстро получает результаты 70
  71. DM + Coordinator = Success? • Масштабирование устройств • Запуск

    на каждый PR • Разработчик быстро получает результаты 71
  72. Flaky tests 72

  73. Flaky e2e tests 73

  74. Fix flaky tests 74

  75. Fix flaky tests • Fast login • Deep Links •

    Test-case review • Rewrite from robotium to espresso • Use API • Use clean bots 75
  76. Test stability 76

  77. DM + Stable tests = Success? • Тесты и инфраструктура

    тесно связаны • CI занят • Сложно работать с параллельными запусками • ... 77
  78. DM + Stable tests = Success? • Тесты и инфраструктура

    тесно связаны • CI занят • Сложно работать с параллельными запусками 78
  79. DM + Stable tests = Success? • Тесты и инфраструктура

    тесно связаны • CI занят • Сложно работать с параллельными запусками 79
  80. DM + Stable tests = Success? • Тесты и инфраструктура

    тесно связаны • CI занят • Сложно работать с параллельными запусками 80
  81. QueueRunner - async tests DeviceManager Coordinator Test Test Test Test

    Test QR Test Test Test Test Test Test Test Test Test Test Nodemanager Nodemanager Nodemanager 81
  82. QueueRunner test flow Prepare device Get device Process test Pull

    data Clear device 82
  83. QueueRunner test flow Prepare device Get device Process test Pull

    data Clear device adb uninstall old-ok.apk adb uninstall old-test-ok.apk …. adb install new-ok.apk adb install new-test-ok.apk 83
  84. QueueRunner test flow Prepare device Get device Process test Pull

    data Clear device adb shell am instrument -w … / 84
  85. QueueRunner test flow Prepare device Get device Process test Pull

    data Clear device adb pull /path/data.1 adb pull /path/data.2 adb pull /path/data.3 …. 85
  86. QueueRunner test flow Prepare device Get device Process test Pull

    data Clear device logcat -c adb uninstall ok.apk adb uninstall test-ok.apk 86
  87. QueueRunner test flow Prepare device Get device Process test Pull

    data Clear device 87
  88. QueueRunner features • Использование всех доступных ресурсов • Управление последовательностью

    тестов • Умные/глупые ретраи • Отчеты о результатах в jira/stash 88
  89. Выводы о QR+DM • Адаптивность к кол-ву ресурсов • Масштабирование

    • Асинхронное выполнение тестов • Разделение инфраструктуры и тестов 89
  90. Timeline 90

  91. 4. Процесс разработки 91

  92. Git Flow - Feature per branch 92

  93. 93

  94. 94

  95. 95

  96. • Сборка • Unit tests • Component tests • E2E

    tests on QR • Test result 96
  97. 97 • Сборка • Unit tests • Component tests •

    E2E tests on QR • Test result
  98. 98

  99. Stash report 99

  100. Jira report 100

  101. Watson - сравнение двух запусков

  102. Watson - стабильные тесты

  103. Watson - известные проблемы

  104. Watson - падающие тесты

  105. Watson - нестабильные тесты

  106. Запрет мерджа • Упал 1 unit тест • Больше threshold

    e2e flaky тестов
  107. Нестабильные разные падения

  108. Простой способ сравнения фейлов • Очистить стектрейс падений ◦ избавиться

    от цифр lambda$123/23523 ◦ оставить номера строк ETestFeedAsSpam.java:80 ◦ придумать что-то свое • Посчитать хеш-сумму от всех строк стектресов • Сравнить хеши
  109. d788cd7d1fba9024cdc4594415447e03c4dc11db

  110. 4. Итоги 110

  111. Итоги • Selenium - свое решение ◦ масштабируемость ◦ отказоустойчивость

    ◦ стабильность 111
  112. Итоги • Android - интеграция с selenium инфраструктурой ◦ масштабируемость

    эмуляторов ◦ наследование сильных сторон существующей инфраструктуры 112
  113. Итоги • DeviceManager - абстракция над девайсом ◦ удаленное взаимодействие

    с девайсами ◦ возможность работать с разными типами девайсов 113
  114. Итоги • QueueRunner ◦ асинхронное выполнение тестов ◦ управление выполнением

    тестов 114
  115. Время прохождения тестов в 2016 115

  116. Время прохождения тестов сейчас 116

  117. Таблица регрессии

  118. Планы • Единая платформа для selenium, android, ios • Тестирование

    на разных версиях • Тестирование производительности 118
  119. Выводы • Начинайте с готового и простого решения • Не

    бойтесь использовать эмуляторы • Полностью готового решения может не быть • При росте можно задуматься о своем решении 119
  120. See also • Managing resources for large-scale testing at Facebook

    • Automation Test as a Service at eBay • Testing Android Apps at Scale with Nitrogen 120
  121. @litemn Роман Иваницкий Инженер Одноклассники Вопросы? roman.ivanitsky@corp.mail.ru

  122. Ссылки 1. Микросервисы для автоматизации тестирования («Одноклассники») https://goo.gl/Do2SVV 2. Управление

    авариями в большом интернет-проекте https://goo.gl/Y5wQGs 3. One-cloud: ОС уровня дата-центра в Одноклассниках https://goo.gl/onFvaS 4. Java adb wrapper https://github.com/vidstige/jadb 5. https://github.com/appium/appium-docker-android 6. https://github.com/budtmo/docker-android 7. https://github.com/agoda-com/docker-emulator-android 8. https://github.com/aerokube/selenoid-images