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.

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

793 visualizaciones

Publicado el

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

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

  • Sé el primero en recomendar esto

Оптимизация 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 Вопросы???

×