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 тестов и ускорение их поддержки

357 views

Published on

Доклад Павла Балахонова на SQA Days-22. 17-18 ноября 2017. Санкт-Петербург, Россия
www.sqadays.com

Published in: Education
  • Be the first to comment

  • Be the first to like this

Оптимизация Selenium тестов и ускорение их поддержки

  1. 1. Оптимизация Selenium тестов и ускорение их поддержки Балахонов Павел QA Automation Engineer Mail.Ru Group
  2. 2. Немного обо мне  Работаю в автоматизации тестирования более 6 лет;  Люблю программировать и искать баги;  Не люблю очереди и делать что-то монотонное вручную;  Нравится изучать и исследовать системы автоматизации;
  3. 3. Медиа проекты
  4. 4. Проблема поддержки UI тестов на медиа проектах  Большое количество UI автоматизированных тестов;  Частый релиз различных проектов;  Неполный анализ ошибок автотестов ручными тестировщиками;  Отсутствие раннего информирования в автотестах об изменениях в приложении;  Большое количество в корне отличающихся по функциональности проектов;  Старый код и архитектура системы UI автоматизации;
  5. 5. Зависимость расхода ресурсов от размера test suite на фиксе “До”
  6. 6. Структура медиа проектов
  7. 7. Структура системы UI автоматизации на проектах “Почта&Портал”
  8. 8. UI тест и его структура
  9. 9. Пример UI теста на медиа проекте @Title("Погода. Поиск. Страница результатов. Счетчик результатов должен отображать верную информацию о количестве найденных городов соответствующих запросу.") @Severity(SeverityLevel.NORMAL) @Test @Issue("TESTCONT-1171") public void search_result_counter() { String search = "Лон"; // Открываем главную navigationSteps.openMainPage(); // Вводим запрос portalToolbarSteps.setSearchField(search); portalToolbarSteps.clickSearch(); // Проверяем страницу результатов searchPageSteps.pageShouldBeOpened(); searchPageSteps.searchRequestShouldBeSameAs(search); } }
  10. 10. Steps как преобразователь интерфейса
  11. 11. Плюсы и минусы Steps Adapter по сравнению с инкапсуляцией на Page Layer Плюсы Минусы Гибкость группировки Избыточность кода Простая генерация отчетов Введение и поддержка дополнительной сущности Соответствие классическому определению структуры теста
  12. 12. Структура страницы в UI тестировании на медиа проектах
  13. 13. Пример реализации страницы на медиа проектах @At("#HOST/prognoz/*.*/by-month") @NamedUrls( { @NamedUrl(name = "city", url = "/prognoz/{1}/by-month") } ) public class YearForecastPage extends AnyPage { public YearForecastPage(WebDriver driver) { super(driver); } @FindBy(css = ".calendar-month") private WebElement monthsBlock; private final String monthLink = ".day_calendar_month a[href$='/%s-%s/']"; public void clickMonthLink(LocalDate today){ String locator = String.format(monthLink, today.getMonth().getDisplayName(TextStyle.FULL, Locale.ENGLISH).toLowerCase(Locale.ENGLISH), today.getYear()); $(locator).click(); }
  14. 14. Динамические и статические локаторы Пример статического локатора Динамические локаторы @FindBy(css = ".calendar-month") private WebElement monthsBlock; private final String monthLinkSelector = ".day_calendar_month a[href$='/%s-%s/']";
  15. 15. Шаблон низкоуровневого взаимодействия
  16. 16. Примеры шаблонов взаимодействия //Возвращает текст из всех элементов по локатору public Function<By, List<String>> getAllElementTextByLocator = locator -> { return getDriver().findElements(locator).parallelStream() .map(WebElement::getText) .collect(Collectors.toList()); }; //Проверяет, что все элементы, соответствуют необходимым условиям public BiFunction<By, Predicate, Boolean> predicateAllMatchesByLocator = (By locator, Predicate predicate) -> return getDriver().findElements(locator) .parallelStream().allMatch(predicate);
  17. 17. Подключение поведенческих шаблонов /** * Базовая страница * @author Pavel Balahonov <p.balahonov@corp.mail.ru> */ public class AnyPage extends AbstractPage { public AnyPage(WebDriver driver) { super(driver); } @FindBy(tagName = "h1") private WebElement header; //Функциональный интерфейс для элементов на странице protected ElementFunctions elementFunctions = new ElementFunctions(getDriver());
  18. 18. Компонент и его структура
  19. 19. Статический Web компонент
  20. 20. Пример статического компонента /** * Элемент определения знака зодиака * @author Pavel Balahonov <p.balahonov@corp.mail.ru> */ @Component(xpath = "//*[@class='p-formitem__label']/ancestor::div[contains(@class, 'block')]") public class DeterminationSignElement extends AnyComponent { public DeterminationSignElement(WebDriver driver) { super(driver); } @FindBy(css = ".p-formitem__content_sub") private WebElement determinationButton; //Набор локаторов для блока "Дата рождения" private final String selectedDateBirthdayLocator = "//div[@data-range='%s']//div[contains(@class, 'dropdown__text')]";
  21. 21. Popup как динамический компонент
  22. 22. Пример динамического компонента /** * Попап пуш уведомлений * @author Pavel Balahonov <p.balahonov@corp.mail.ru> */ @Popup public class PushNotificationElement extends AnyComponent { private final String declineButtonSelector = ".m-push-notifications__button [data-action='defer']"; public PushNotificationElement(WebDriver driver) { super(driver); } public boolean isPopupPresent() { return waitForElementPresent(By.cssSelector(formSelector)); }
  23. 23. Роль компонентов в поддержке тестов Ранняя валидация; Лучшая архитектура UI автотестов; Отсутствие дублирования кода; Поддерживаем компонент, а не страницы, где он используется;
  24. 24. Навигационный валидатор /** * Страница гороскопа * @author Pavel Balahonov <p.balahonov@corp.mail.ru> */ @At("#HOST/prediction/[a-z]+/[a-z]+/") @NamedUrls( @NamedUrl(name = "prediction", url = "/prediction/{1}/{2}") ) public class PredictionPage extends AnyPage { public PredictionPage(WebDriver driver) { super(driver); } @FindBy(id = "other_zodiac_sign") private WebElement otherZodiacSignBlock;
  25. 25. Common Page API и его роль в поддержке Единые механизмы решения общих задач; Поддержка взаимодействия с внешними сервисами; Протестированные механизмы решения типичных задач; Информативность и детализированное логирование;
  26. 26. Процесс поддержки UI тестов и его организация
  27. 27. Преимущества и недостатки данной организации процесса поддержки Плюсы Минусы Отсутствие бесконечного процесса поддержки Отсутствует возможность запуска полных прогонов нерелизных проектов в любое время Сокращается время поддержки тестов и остается время на покрытие новых кейсов Необходимость поддержки актуальности планировщика (scheduler)
  28. 28. Итоговые мероприятия по ускорению поддержки UI тестов без потери качества  Раннее информирование в автотестах;  Структурированность автотестов;  Отсутствие поддержки логики взаимодействия с элементами и внешними сервисами;  Поддержка автотестов по расписанию;
  29. 29. Зависимость расхода ресурсов от размера test suite на фиксе “После”
  30. 30. Контакты: skype: svyatoj88 e-mail: svyatoj1988@gmail.com Вопросы???

×