Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.

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

723 Aufrufe

Veröffentlicht am

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

Veröffentlicht in: Bildung
  • Als Erste(r) kommentieren

  • Gehören Sie zu den Ersten, denen das gefällt!

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 Контакты Павел Иванов

×