Se ha denunciado esta presentación.
Utilizamos tu perfil de LinkedIn y tus datos de actividad para personalizar los anuncios y mostrarte publicidad más relevante. Puedes cambiar tus preferencias de publicidad en cualquier momento.

End-2-End UI автоматизация в мобильном приложении. Наша реализация

727 visualizaciones

Publicado el

Доклад Павла Иванова на конференции SQA Days-21
www.sqadays.com

Publicado en: Educación
  • Sé el primero en comentar

  • Sé el primero en recomendar esto

End-2-End UI автоматизация в мобильном приложении. Наша реализация

  1. 1. End-2-End UI автоматизация в мобильном приложении. Наша реализация.
  2. 2. ‣ Работаю в Альфа-Лаборатории ‣ Занимаюсь автоматизацией тестирования мобильных приложений Обо мне
  3. 3. Инструменты для автоматизации тестирования Android iOS Cross-platform Robotium UI Recorder Appium Espresso Keep it Functional Calabash
  4. 4. Инструменты для автоматизации тестирования Android iOS Cross-platform Robotium UI Recorder Appium Espresso Keep it Functional Calabash
  5. 5. Какие проблемы мы решали? ‣ Высокий порог входа для функциональных тестировщиков ‣ Поддержка двух платформ: iOS, Android внутри одного проекта ‣ Универсальность, переиспользование компонент внутри проекта ‣ Параллельный запуск UI - тестов на CI ‣ Масштабирование на другие мобильные проекты
  6. 6. Понижаем порог входа!
  7. 7. Meta: @regressCycle @smokeCycle Narrative: TESTAM-819 Успешная оплата шаблона Мобильная связь Lifecycle: Before: Given вернуться на "Главный экран" Scenario: Успешная оплата шаблона Мобильная связь Given приложение запущено Then загружена страница "Главный экран" When скролл внутри "Основной список" до "Платежи и переводы" When выполнено нажатие на "Шаблоны" Then загружена страница "Платежи и переводы" … Then загружена страница "Главный экран" Examples: |phoneNumber |amount| |+7 916 666-66-66|10.00 | Пример сценария, написанного с использованием JBehave
  8. 8. Элементы на странице ‣ resourceId / accessibilityidentifier (Android / iOS) ‣ text ‣ content-desc (Android) ‣ XPath
  9. 9. Пример описания страницы
  10. 10. Как не завалить весь прогон из-за одного теста? Scenario: Успешная оплата шаблона Мобильная связь Given приложение запущено Then загружена страница "Главный экран" When скролл внутри "Основной список" до "Платежи и переводы" When выполнено нажатие на "Шаблоны" … Then загружена страница "Главный экран"
  11. 11. Точка входа Scenario: Успешная оплата шаблона Мобильная связь Given приложение запущено Then загружена страница "Главный экран" When скролл внутри "Основной список" до "Платежи и переводы" When выполнено нажатие на "Шаблоны" … Then загружена страница "Главный экран"
  12. 12. Шаг возврата на точку входа Lifecycle: Before: Given вернуться на "Главный экран" Scenario: Успешная оплата шаблона Мобильная связь Given приложение запущено
  13. 13. Meta Info Meta: @regressCycle @smokeCycle Meta Matcher Meta Property Matched +theme smoke testing -skip @theme smoke testing true +theme smoke testing -skip @skip false +theme smoke testing @theme smoke testing true +theme smoke testing @theme testing false -skip @theme testing true -skip @skip false +theme smoke testing -theme UI @theme smoke testing true +theme smoke testing -theme UI @theme UI false
  14. 14. Test Cycle
  15. 15. Поддерживаем две платформы внутри одного проекта
  16. 16. ‣ Не нужно поддерживать два проекта ‣ Не нужно иметь экспертизу сразу в нескольких языках программирования ‣ Используется один инструмент для автоматизации ‣ Переиспользуем низкоуровневую логику ‣ Переиспользуем тестовые данные Плюсы
  17. 17. ‣ Не все компоненты удается переиспользовать ‣ Различное поведение iOS и Android драйвера ‣ Релиз Appium может что-то сломать для Anroid или iOS и наоборот Минусы
  18. 18. Пример шага для двух платформ @Step @When("выполнено нажатие на "$button"") public void buttonClick(@Named("$button") String button) { getWebElementByName(button).click(); } protected WebElement getWebElementByName(String elementName) { IElement element = getCurrentPage().getElementByName(elementName); return finder.findWebElement(element); }
  19. 19. Пример шага только для Android @Step @When("выполнено нажатие на Назад") public void systemBackClick() { ((AndroidDriver) driver).pressKeyCode(AndroidKeyCode.BACK); }
  20. 20. Cтруктура проекта am-ui-tests 1.0
  21. 21. Запускаемся параллельно!
  22. 22. Инструменты для параллельного запуска +
  23. 23. Appium Node для Nexus 5X { "capabilities": [ { "browserName": "", "udid": "00d1ce8f827cceab", "deviceName": "Nexus5X", "version": "6.0.1", "maxInstances": 5, "platform": "ANDROID" } ], "configuration": { "cleanUpCycle": 2000, "timeout": 30000, "hub": "http://localhost:5566/grid/register/", "proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy", "url": "http://127.0.0.1:4719/wd/hub", "remoteHost": "http://127.0.0.1:4719", "host": "localhost", "port": 4719, "maxSession": 5, "register": true, "registerCycle": 5000, "hubPort": 5566, "hubHost": "localhost", "role": "node" } }
  24. 24. Web-интерфейс Selenium Server
  25. 25. Запуск проекта ./gradlew --info clean test --tests "*AndroidStories*" -Pplatform=android6 -Puser=5773935 -PtestType=smokeNewReg -PbuildVersion=8.5.0.3,development ./gradlew --info clean test --tests "*IOSStories*" -Pplatform=ios10 -Puser=1907306 -PtestType=smokeNewReg -PbuildVersion=8.5_7727 iOS Android
  26. 26. Запуск job на jenkins
  27. 27. Отчет о тестировании
  28. 28. Отчет о тестировании
  29. 29. Масштабируемся!
  30. 30. ‣ Упаковываем всю низкоуровневую логику в библиотеку ‣ Упаковываем универсальные шаги ‣ Снижаем связанность проекта, внедряем Spring colibri-ui
  31. 31. Cтруктура проекта am-ui-tests 2.0
  32. 32. Сравнение am-ui-test 1.0 / am-ui-tests 2.0
  33. 33. Внедряем Spring, формируем Uber-шаги @Autowired private PagesSteps pagesSteps; @Autowired @Qualifier("android") private ISystemButtonsClick systemButtonsClick;
  34. 34. Внедряем Spring, формируем Uber-шаги @Step @Given("вернуться на "$screenName"") public void goToScreen(@org.jbehave.core.annotations.Named("$screenName") String screenName) { goToMain(screenName); } protected void returnCycle(String screenName) { boolean up = true; int countStepsToFailure = 7; do { try { //обрабатываем аллерт finder.findWebElement(By.xpath(getAlertLocator())).click(); } catch (Exception ignored) { } try { //проверяем что загружена главная pagesSteps.pageLoaded(screenName); up = false; } catch (Exception e) { try { //если не загружена, пытаемся нажать кнопку "Назад" getISystemButtonsClickBean().systemBackClick(); } catch (Exception ignored) { } } countStepsToFailure--; } while (up && countStepsToFailure > 0); }
  35. 35. Внедряем Spring, формируем Uber-шаги @Step @Given("вернуться на "$screenName"") public void goToScreen(@org.jbehave.core.annotations.Named("$screenName") String screenName) { goToMain(screenName); } protected void returnCycle(String screenName) { boolean up = true; int countStepsToFailure = 7; do { try { //обрабатываем аллерт finder.findWebElement(By.xpath(getAlertLocator())).click(); } catch (Exception ignored) { } try { //проверяем что загружена главная pagesSteps.pageLoaded(screenName); up = false; } catch (Exception e) { try { //если не загружена, пытаемся нажать кнопку "Назад" getISystemButtonsClickBean().systemBackClick(); } catch (Exception ignored) { } } countStepsToFailure--; } while (up && countStepsToFailure > 0); }
  36. 36. Проблемы Appium:-(
  37. 37. Проблемы Appium ‣ Ждем обновлений Appium после выхода новых платформ ‣ XCUIElementType на версии iOS 9.3 ‣ Собираем различные дефекты appium (1.6.1 долгий поиск элементов на iOS и т.д.) ‣ Проблемы в работе с web-view ‣ Проблема с доступами на iOS ‣ …
  38. 38. Результат!
  39. 39. Что мы получили! ‣ Универсальную, масштабируемую библиотеку ‣ Два мобильных проекта уже запускают e2e ui-автотесты с использованием нашего фреймфорка ‣ Функциональные тестировщики избавляются от части ручного тестирования ‣ Регрессионное тестирование на обратную совместимость с backend прогоняется автоматизированно
  40. 40. open-source https://github.com/alfa-laboratory/colibri-ui colibri-ui уже стала open-source! Все на GitHub! Хватит тестировать руками:-) https://github.com/alfa-laboratory/colibri-ui-template
  41. 41. mail: pvivanov@alfabank.ru telegram: @Pash_Ivanov facebook: pavel.ivanov.92560 Контакты Павел Иванов

×