2. Немного обо мне
Работаю в автоматизации тестирования
более 6 лет;
Люблю программировать и искать баги;
Не люблю очереди и делать что-то
монотонное вручную;
Нравится изучать и исследовать
системы автоматизации;
4. Проблема поддержки UI тестов на медиа
проектах
Большое количество UI автоматизированных тестов;
Частый релиз различных проектов;
Неполный анализ ошибок автотестов ручными тестировщиками;
Отсутствие раннего информирования в автотестах об изменениях в
приложении;
Большое количество в корне отличающихся по функциональности
проектов;
Старый код и архитектура системы 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
Плюсы Минусы
Гибкость группировки Избыточность кода
Простая генерация отчетов Введение и поддержка
дополнительной сущности
Соответствие классическому
определению структуры теста
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 <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());
23. Пример динамического компонента
/**
* Попап пуш уведомлений
* @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));
}
24. Роль компонентов в поддержке тестов
Ранняя валидация;
Лучшая архитектура UI автотестов;
Отсутствие дублирования кода;
Поддерживаем компонент, а не страницы, где он
используется;
27. Навигационный валидатор
/**
* Страница гороскопа
* @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;
30. Common Page API и его роль в поддержке
Единые механизмы решения общих задач;
Поддержка взаимодействия с внешними сервисами;
Протестированные механизмы решения типичных задач;
Информативность и детализированное логирование;
32. Преимущества и недостатки данной
организации процесса поддержки
Плюсы Минусы
Отсутствие бесконечного процесса
поддержки
Отсутствует возможность запуска
полных прогонов нерелизных
проектов в любое время
Сокращается время поддержки
тестов и остается время на
покрытие новых кейсов
Необходимость поддержки
актуальности планировщика
(scheduler)
33. Итоговые мероприятия по ускорению
поддержки UI тестов без потери качества
Раннее информирование в автотестах;
Структурированность автотестов;
Отсутствие поддержки логики взаимодействия с элементами и
внешними сервисами;
Поддержка автотестов по расписанию;