Разгоняем UI автоматизированные тесты.
Профилирование UI тестов.
Балахонов Павел
QA Automation Engineer
Mail.Ru Group
Немного обо мне
• Работаю в автоматизации
тестирования более 6 лет
• Увлекаюсь современными
технологиями
• Мечтаю автоматизировать весь
мир =)
Суть проблемы
• Большое время прогона UI тестов
• Нечестная балансировка нагрузки в инфраструктуре
• Нечестное распараллеливание тестов
• Отсутствие стабильности системы прогона тестов
• Сложность поддержки инфраструктуры
• Медленные тесты
Зависимость времени прогона от размера test suite
Профилирование
тестов
Замедление прогона на уровне теста
• Использование статических таймаутов
• Выставление precondition через UI интерфейс
• Использование только положительных условий
ожидания
• Неоправданные обращения к браузеру
• Начало теста с главной страницы
Статические таймауты
Thread.sleep(500)
waitABit(500)
Выставление precondition через UI интерфейс
Использование только положительных условий ожидания
public boolean isButtonPresent() {
return waitForElementPresent(By.xpath(buttonLocator));
}
@Step
public void buttonShouldNotBePresent() {
assertFalse(“Кнопка отображается на странице”, isButtonPresent());
}
@Step
public void buttonShouldBePresent() {
assertTrue(“Кнопка не отображается на странице”, isButtonPresent());
}
Неоправданные обращения к браузеру
private WebElement getInputField(FieldData field) {
String locator = String.format(inputFieldLocator, field.getType);
return getDriver().findElement(By.xpath(locator));
}
public void enterValueAndEnter(FieldData field, String value) {
getInputField(field).sendKeys(value);
getInputField(field).sendKeys(Keys.ENTER);
}
Начало теста с главной страницы
Пути решения
Динамические таймауты и слушатели ожидания
Выставление precondition теста через API
Целесообразное использование нужных условий ожидания
public boolean isButtonPresent() {
return waitForElementPresent(By.xpath(buttonLocator));
}
public boolean isButtonNotPresent() {
return waitForElementNotPresent(By.xpath(buttonLocator));
}
@Step
public void buttonShouldBePresent() {
assertTrue(“Кнопка не отображается”, isButtonPresent());
}
@Step
public void buttonShouldNotBePresent() {
assertTrue(“Кнопка отображается”, isButtonNotPresent());
}
Уменьшение взаимодействия с браузером
private WebElement getInputField(FieldData field) {
String locator = String.format(inputFieldLocator, field.getType);
return getDriver().findElement(By.xpath(locator));
}
public void enterValueAndEnter(FieldData field, String value) {
WebElement field = getInputField(field);
field.sendKeys(value);
field.sendKeys(Keys.ENTER);
}
Система запуска UI тестов. Selenium GRID.
Selenium GRID + Docker
Распараллеливание Selenium тестов
Разбиение прогона на Batches
Структура системы параллельного запуска UI тестов на
проектах Почта, Cloud и Media (нагрузка >3000 тестов)
Сравнение зависимостей времен прогона от размера test suite
Контакты:
Skype: svyatoj88
E-mail: p.balahonov@corp.mail.ru

Speeding up UI tests, profiling of UI tests