O slideshow foi denunciado.
Utilizamos seu perfil e dados de atividades no LinkedIn para personalizar e exibir anúncios mais relevantes. Altere suas preferências de anúncios quando desejar.
Оптимизация Selenium тестов и ускорение
их поддержки
Балахонов Павел
QA Automation Engineer
Mail.Ru Group
Немного обо мне
 Работаю в автоматизации тестирования
более 6 лет;
 Люблю программировать и искать баги;
 Не люблю очер...
Медиа проекты
Проблема поддержки UI тестов на медиа
проектах
 Большое количество UI автоматизированных тестов;
 Частый релиз различных...
Зависимость расхода ресурсов от размера test
suite на фиксе “До”
Структура медиа проектов
Структура системы UI автоматизации на проектах
“Почта&Портал”
UI тест и его структура
Пример UI теста на медиа проекте
@Title("Погода. Поиск. Страница результатов. Счетчик результатов должен отображать
верную...
Steps как преобразователь интерфейса
Плюсы и минусы Steps Adapter по сравнению с
инкапсуляцией на Page Layer
Плюсы Минусы
Гибкость группировки Избыточность код...
Структура страницы в UI тестировании на
медиа проектах
Пример реализации страницы на медиа проектах
@At("#HOST/prognoz/*.*/by-month")
@NamedUrls(
{
@NamedUrl(name = "city", url ...
Динамические и статические локаторы
Пример статического локатора
Динамические локаторы
@FindBy(css = ".calendar-month")
pr...
Шаблон низкоуровневого взаимодействия
Примеры шаблонов взаимодействия
//Возвращает текст из всех элементов по локатору
public Function<By, List<String>> getAllE...
Подключение поведенческих шаблонов
/**
* Базовая страница
* @author Pavel Balahonov <p.balahonov@corp.mail.ru>
*/
public c...
Компонент и его структура
Статический Web компонент
Пример статического компонента
/**
* Элемент определения знака зодиака
* @author Pavel Balahonov <p.balahonov@corp.mail.ru...
Popup как динамический компонент
Пример динамического компонента
/**
* Попап пуш уведомлений
* @author Pavel Balahonov <p.balahonov@corp.mail.ru>
*/
@Popup...
Роль компонентов в поддержке тестов
Ранняя валидация;
Лучшая архитектура UI автотестов;
Отсутствие дублирования кода;
...
Навигационный валидатор
/**
* Страница гороскопа
* @author Pavel Balahonov <p.balahonov@corp.mail.ru>
*/
@At("#HOST/predic...
Common Page API и его роль в поддержке
Единые механизмы решения общих задач;
Поддержка взаимодействия с внешними сервиса...
Процесс поддержки UI тестов и его организация
Преимущества и недостатки данной
организации процесса поддержки
Плюсы Минусы
Отсутствие бесконечного процесса
поддержки
От...
Итоговые мероприятия по ускорению
поддержки UI тестов без потери качества
 Раннее информирование в автотестах;
 Структур...
Зависимость расхода ресурсов от размера
test suite на фиксе “После”
Контакты:
skype: svyatoj88
e-mail: svyatoj1988@gmail.com
Вопросы???
Оптимизация Selenium тестов и ускорение их поддержки
Оптимизация Selenium тестов и ускорение их поддержки
Оптимизация Selenium тестов и ускорение их поддержки
Оптимизация Selenium тестов и ускорение их поддержки
Оптимизация Selenium тестов и ускорение их поддержки
Оптимизация Selenium тестов и ускорение их поддержки
Próximos SlideShares
Carregando em…5
×

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

515 visualizações

Publicada em

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

Publicada em: Educação
  • Seja o primeiro a comentar

  • Seja a primeira pessoa a gostar disto

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

×