SlideShare a Scribd company logo
Оптимизация Selenium тестов и ускорение
их поддержки
Балахонов Павел
QA Automation Engineer
Mail.Ru Group
Немного обо мне
 Работаю в автоматизации тестирования
более 6 лет;
 Люблю программировать и искать баги;
 Не люблю очереди и делать что-то
монотонное вручную;
 Нравится изучать и исследовать
системы автоматизации;
Медиа проекты
Проблема поддержки UI тестов на медиа
проектах
 Большое количество UI автоматизированных тестов;
 Частый релиз различных проектов;
 Неполный анализ ошибок автотестов ручными тестировщиками;
 Отсутствие раннего информирования в автотестах об изменениях в
приложении;
 Большое количество в корне отличающихся по функциональности
проектов;
 Старый код и архитектура системы UI автоматизации;
Зависимость расхода ресурсов от размера test
suite на фиксе “До”
Оптимизация Selenium тестов и ускорение их поддержки
Структура медиа проектов
Структура системы UI автоматизации на проектах
“Почта&Портал”
UI тест и его структура
Пример 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);
}
}
Steps как преобразователь интерфейса
Плюсы и минусы Steps Adapter по сравнению с
инкапсуляцией на Page Layer
Плюсы Минусы
Гибкость группировки Избыточность кода
Простая генерация отчетов Введение и поддержка
дополнительной сущности
Соответствие классическому
определению структуры теста
Структура страницы в UI тестировании на
медиа проектах
Пример реализации страницы на медиа проектах
@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();
}
Динамические и статические локаторы
Пример статического локатора
Динамические локаторы
@FindBy(css = ".calendar-month")
private WebElement monthsBlock;
private final String monthLinkSelector =
".day_calendar_month a[href$='/%s-%s/']";
Шаблон низкоуровневого взаимодействия
Примеры шаблонов взаимодействия
//Возвращает текст из всех элементов по локатору
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);
Подключение поведенческих шаблонов
/**
* Базовая страница
* @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());
Компонент и его структура
Статический Web компонент
Пример статического компонента
/**
* Элемент определения знака зодиака
* @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')]";
Popup как динамический компонент
Пример динамического компонента
/**
* Попап пуш уведомлений
* @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));
}
Роль компонентов в поддержке тестов
Ранняя валидация;
Лучшая архитектура UI автотестов;
Отсутствие дублирования кода;
Поддерживаем компонент, а не страницы, где он
используется;
Оптимизация Selenium тестов и ускорение их поддержки
Оптимизация Selenium тестов и ускорение их поддержки
Навигационный валидатор
/**
* Страница гороскопа
* @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;
Оптимизация Selenium тестов и ускорение их поддержки
Оптимизация Selenium тестов и ускорение их поддержки
Common Page API и его роль в поддержке
Единые механизмы решения общих задач;
Поддержка взаимодействия с внешними сервисами;
Протестированные механизмы решения типичных задач;
Информативность и детализированное логирование;
Процесс поддержки UI тестов и его организация
Преимущества и недостатки данной
организации процесса поддержки
Плюсы Минусы
Отсутствие бесконечного процесса
поддержки
Отсутствует возможность запуска
полных прогонов нерелизных
проектов в любое время
Сокращается время поддержки
тестов и остается время на
покрытие новых кейсов
Необходимость поддержки
актуальности планировщика
(scheduler)
Итоговые мероприятия по ускорению
поддержки UI тестов без потери качества
 Раннее информирование в автотестах;
 Структурированность автотестов;
 Отсутствие поддержки логики взаимодействия с элементами и
внешними сервисами;
 Поддержка автотестов по расписанию;
Зависимость расхода ресурсов от размера
test suite на фиксе “После”
Оптимизация Selenium тестов и ускорение их поддержки
Контакты:
skype: svyatoj88
e-mail: svyatoj1988@gmail.com
Вопросы???

More Related Content

PPT
Как hh.ru дошли до 500 релизов в квартал без потери в качестве
PDF
Apache.JMeter для .NET-проектов
PPT
Делаем автоматизацию проектных KPIs
PPTX
Quality Assurance vs Quality Control - так в чем же заключается работа специа...
PPT
Новый процесс тестирования на "старом" проекте
PPTX
Добиваемся эффективности каждого из 9000+ UI-тестов
PPTX
Способы организаций больших Java проектов по Автоматизированному тестированию
PPTX
Непрерывная интеграция и автотесты. Сравнительный анализ инструментов
Как hh.ru дошли до 500 релизов в квартал без потери в качестве
Apache.JMeter для .NET-проектов
Делаем автоматизацию проектных KPIs
Quality Assurance vs Quality Control - так в чем же заключается работа специа...
Новый процесс тестирования на "старом" проекте
Добиваемся эффективности каждого из 9000+ UI-тестов
Способы организаций больших Java проектов по Автоматизированному тестированию
Непрерывная интеграция и автотесты. Сравнительный анализ инструментов

What's hot (20)

PPTX
Автоматизация визуального тестирования адаптивного дизайна на примере Galen F...
PDF
WP как экспериментальная платформа
PDF
Организация процессов разработки на основе VSTS и TFS
PDF
Enter: testing
PPTX
Web application testing architecture
PDF
QA Fest 2016. Дмитрий Химион. Векторы развития систем автоматизации тестиров...
PDF
QA Fes 2016. Анастасия Асеева. Роль тестирования в Devops
PPTX
Архитектура автоматизированных тестов: представление предметной области
PPTX
Андрей Лазарев “Архітектура тестування Enterprise Web додатків”
PPTX
Test link introduction
PPT
Подход к тестированию хранилища данных на базе MS SQL Server
PPTX
Тестирование слоёного пирога
PPTX
Do you know what you are testing?
PPTX
Обзор и архитектура MS Visual Studio Team System 2008
PPTX
TestLink
PPTX
Эффективное использование Microsoft team system для улучшения процессов разра...
PPT
Процесс тестирования в условиях неявных требований
PPTX
Автоматизация визуального тестирования адаптивного дизайна на примере Galen F...
PPTX
Тестирование веб-проектов в Agile
PDF
Денис Чистяков: Workflow. Работа над проектом в Яндексе
Автоматизация визуального тестирования адаптивного дизайна на примере Galen F...
WP как экспериментальная платформа
Организация процессов разработки на основе VSTS и TFS
Enter: testing
Web application testing architecture
QA Fest 2016. Дмитрий Химион. Векторы развития систем автоматизации тестиров...
QA Fes 2016. Анастасия Асеева. Роль тестирования в Devops
Архитектура автоматизированных тестов: представление предметной области
Андрей Лазарев “Архітектура тестування Enterprise Web додатків”
Test link introduction
Подход к тестированию хранилища данных на базе MS SQL Server
Тестирование слоёного пирога
Do you know what you are testing?
Обзор и архитектура MS Visual Studio Team System 2008
TestLink
Эффективное использование Microsoft team system для улучшения процессов разра...
Процесс тестирования в условиях неявных требований
Автоматизация визуального тестирования адаптивного дизайна на примере Galen F...
Тестирование веб-проектов в Agile
Денис Чистяков: Workflow. Работа над проектом в Яндексе
Ad

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

PPT
Selenium 2.0: обзор новых возможностей
PPTX
Автоматизация тестирования iOS приложений: от идеи к готовому решению
PPT
Средства разработки web приложений (Web frameworks)
PDF
Mobile automation uamobile
PDF
C# Web. Занятие 06.
PPTX
iOS and Android Mobile Test Automation
PPT
автоматизация тестирования веб приложений павел липский
PDF
Jsfwdays 2013-2
PPT
Автоматизируйте это немедленно или коллекция инструментов автотестирования с ...
PPTX
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
PPTX
Разработка Web-приложений на Angular JS. Архитектурные семинары Softengi
PPT
Alexander manuhin selenium_php_v2.0
PPT
Приемочные тесты на огурце
PDF
Плюсы и минусы автоматизации, пример из жизни
PPTX
Дмитрий Лукьяненко: Первый фреймворк на Selenium + TestNG
PPTX
Test Driven Development in ASP.NET MVC 3
PPTX
DUMP-2012 - Мобильные технологии - "Как мы выстраиваем разработку сервиса под...
PPTX
Automation Functional Testing in Agile Projects
PDF
Дело тестера боится: как в опытных руках могут заиграть Java и TestNg
PDF
Meet Magento Belarus 2015: Denis Bosak
Selenium 2.0: обзор новых возможностей
Автоматизация тестирования iOS приложений: от идеи к готовому решению
Средства разработки web приложений (Web frameworks)
Mobile automation uamobile
C# Web. Занятие 06.
iOS and Android Mobile Test Automation
автоматизация тестирования веб приложений павел липский
Jsfwdays 2013-2
Автоматизируйте это немедленно или коллекция инструментов автотестирования с ...
Бодрящий микс из Selenium и TestNG- регрессионное тестирование руками разрабо...
Разработка Web-приложений на Angular JS. Архитектурные семинары Softengi
Alexander manuhin selenium_php_v2.0
Приемочные тесты на огурце
Плюсы и минусы автоматизации, пример из жизни
Дмитрий Лукьяненко: Первый фреймворк на Selenium + TestNG
Test Driven Development in ASP.NET MVC 3
DUMP-2012 - Мобильные технологии - "Как мы выстраиваем разработку сервиса под...
Automation Functional Testing in Agile Projects
Дело тестера боится: как в опытных руках могут заиграть Java и TestNg
Meet Magento Belarus 2015: Denis Bosak
Ad

More from SQALab (20)

PDF
Готовим стажировку
PPTX
Куда приводят мечты? или Искусство развития тестировщика
PPT
Автоматизация 0.0: 0 - бюджет, 0 - опыт программирования
PPTX
Нагрузочное тестирование нестандартных протоколов с использованием Citrix и J...
PPTX
Continuous performance testing
PDF
Конфиги вместо костылей. Pytestconfig и зачем он нужен
PPT
Команда чемпионов в ИТ стихии
PPTX
API. Серебряная пуля в магазине советов
PDF
Вредные привычки в тест-менеджменте
PPTX
Мощь переполняет с JDI 2.0 - новая эра UI автоматизации
PPTX
Стили лидерства и тестирование
PPT
"Давайте не будем про качество"
PPTX
Тестирование геолокационных систем
PPTX
Лидер или босс? Вот в чем вопрос
PPTX
От Зефира в коробке к Structure Zephyr или как тест-менеджеру перекроить внут...
PPTX
Истинная сила тестировщика - информация
PPT
Автоматизация тестирования встроенного ПО
PPTX
Правильный подход к составлению профиля нагрузочного тестирования
PDF
Sustainable Test Automation: Collaborate within Team
PDF
Test Data Preparation: Tips and Tricks
Готовим стажировку
Куда приводят мечты? или Искусство развития тестировщика
Автоматизация 0.0: 0 - бюджет, 0 - опыт программирования
Нагрузочное тестирование нестандартных протоколов с использованием Citrix и J...
Continuous performance testing
Конфиги вместо костылей. Pytestconfig и зачем он нужен
Команда чемпионов в ИТ стихии
API. Серебряная пуля в магазине советов
Вредные привычки в тест-менеджменте
Мощь переполняет с JDI 2.0 - новая эра UI автоматизации
Стили лидерства и тестирование
"Давайте не будем про качество"
Тестирование геолокационных систем
Лидер или босс? Вот в чем вопрос
От Зефира в коробке к Structure Zephyr или как тест-менеджеру перекроить внут...
Истинная сила тестировщика - информация
Автоматизация тестирования встроенного ПО
Правильный подход к составлению профиля нагрузочного тестирования
Sustainable Test Automation: Collaborate within Team
Test Data Preparation: Tips and Tricks

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

  • 1. Оптимизация Selenium тестов и ускорение их поддержки Балахонов Павел QA Automation Engineer Mail.Ru Group
  • 2. Немного обо мне  Работаю в автоматизации тестирования более 6 лет;  Люблю программировать и искать баги;  Не люблю очереди и делать что-то монотонное вручную;  Нравится изучать и исследовать системы автоматизации;
  • 4. Проблема поддержки UI тестов на медиа проектах  Большое количество UI автоматизированных тестов;  Частый релиз различных проектов;  Неполный анализ ошибок автотестов ручными тестировщиками;  Отсутствие раннего информирования в автотестах об изменениях в приложении;  Большое количество в корне отличающихся по функциональности проектов;  Старый код и архитектура системы UI автоматизации;
  • 5. Зависимость расхода ресурсов от размера test suite на фиксе “До”
  • 8. Структура системы UI автоматизации на проектах “Почта&Портал”
  • 9. UI тест и его структура
  • 10. Пример 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); } }
  • 12. Плюсы и минусы Steps Adapter по сравнению с инкапсуляцией на Page Layer Плюсы Минусы Гибкость группировки Избыточность кода Простая генерация отчетов Введение и поддержка дополнительной сущности Соответствие классическому определению структуры теста
  • 13. Структура страницы в UI тестировании на медиа проектах
  • 14. Пример реализации страницы на медиа проектах @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(); }
  • 15. Динамические и статические локаторы Пример статического локатора Динамические локаторы @FindBy(css = ".calendar-month") private WebElement monthsBlock; private final String monthLinkSelector = ".day_calendar_month a[href$='/%s-%s/']";
  • 17. Примеры шаблонов взаимодействия //Возвращает текст из всех элементов по локатору 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);
  • 18. Подключение поведенческих шаблонов /** * Базовая страница * @author Pavel Balahonov <[email protected]> */ public class AnyPage extends AbstractPage { public AnyPage(WebDriver driver) { super(driver); } @FindBy(tagName = "h1") private WebElement header; //Функциональный интерфейс для элементов на странице protected ElementFunctions elementFunctions = new ElementFunctions(getDriver());
  • 19. Компонент и его структура
  • 21. Пример статического компонента /** * Элемент определения знака зодиака * @author Pavel Balahonov <[email protected]> */ @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')]";
  • 23. Пример динамического компонента /** * Попап пуш уведомлений * @author Pavel Balahonov <[email protected]> */ @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)); }
  • 24. Роль компонентов в поддержке тестов Ранняя валидация; Лучшая архитектура UI автотестов; Отсутствие дублирования кода; Поддерживаем компонент, а не страницы, где он используется;
  • 27. Навигационный валидатор /** * Страница гороскопа * @author Pavel Balahonov <[email protected]> */ @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;
  • 30. Common Page API и его роль в поддержке Единые механизмы решения общих задач; Поддержка взаимодействия с внешними сервисами; Протестированные механизмы решения типичных задач; Информативность и детализированное логирование;
  • 31. Процесс поддержки UI тестов и его организация
  • 32. Преимущества и недостатки данной организации процесса поддержки Плюсы Минусы Отсутствие бесконечного процесса поддержки Отсутствует возможность запуска полных прогонов нерелизных проектов в любое время Сокращается время поддержки тестов и остается время на покрытие новых кейсов Необходимость поддержки актуальности планировщика (scheduler)
  • 33. Итоговые мероприятия по ускорению поддержки UI тестов без потери качества  Раннее информирование в автотестах;  Структурированность автотестов;  Отсутствие поддержки логики взаимодействия с элементами и внешними сервисами;  Поддержка автотестов по расписанию;
  • 34. Зависимость расхода ресурсов от размера test suite на фиксе “После”