E2E (End-to-End) тестирование предназначено для проверки полного пользовательского сценария работы компонента автодополнения в условиях, максимально приближенных к реальной эксплуатации. В отличие от модульных тестов, которые проверяют отдельные методы и функции, и интеграционных тестов, контролирующих взаимодействие нескольких частей системы, E2E-тесты исследуют поведение всей страницы целиком через браузер.
Для библиотеки Awesomplete такой подход особенно важен, поскольку её работа зависит сразу от нескольких факторов:
Только E2E-тест способен подтвердить, что конечный пользователь действительно сможет открыть список подсказок, выбрать нужный элемент и получить ожидаемый результат.
Для компонентов автодополнения обычно тестируются следующие сценарии:
После ввода текста пользователь должен увидеть список вариантов.
Пример сценария:
Проверяется не внутренняя логика Awesomplete, а фактическое поведение интерфейса.
Пользователь может кликнуть по одной из подсказок.
Проверяется:
Например:
await page.click(".item");
После выполнения действия тест убеждается, что выбранное значение действительно появилось в поле ввода.
Awesomplete активно использует навигацию клавиатурой.
Необходимо проверять:
Типичный пользовательский сценарий:
Ввод текста
↓
Стрелка вниз
↓
Выбор подсказки
↓
Enter
После завершения сценария тест должен подтвердить корректность выбранного значения.
Список должен исчезать в определённых ситуациях:
Тесты проверяют отсутствие выпадающего меню в DOM либо его скрытое состояние.
Многие проекты используют Awesomplete совместно с AJAX-запросами.
Типичная схема:
Пользователь вводит текст
↓
Fetch-запрос
↓
Получение данных
↓
Обновление списка
↓
Показ подсказок
E2E-тест проверяет весь процесс целиком.
Один из самых популярных инструментов для тестирования пользовательских интерфейсов.
Особенности:
Пример:
cy.visit("/");
cy.get("#country")
.type("Kaz");
cy.get(".awesomplete ul li")
.should("contain", "Kazakhstan");
Современный инструмент от Microsoft.
Преимущества:
Пример:
await page.goto("/");
await page.fill("#country", "Kaz");
await expect(
page.locator(".awesomplete ul li")
).toContainText("Kazakhstan");
Классический инструмент автоматизации браузеров.
Несмотря на возраст, продолжает использоваться в крупных корпоративных системах.
Преимущества:
Перед запуском E2E-тестов необходимо обеспечить предсказуемую среду выполнения.
Обычно используются:
Пример списка стран:
[
"Kazakhstan",
"Canada",
"China",
"Japan"
]
Если данные меняются между запусками, тесты становятся нестабильными.
Наиболее простой сценарий связан с локальным источником данных.
HTML:
<input id="country">
Jav * aScript:
new Awesomplete(
document.getElementById("country"),
{
list: [
"Kazakhstan",
"Canada",
"China"
]
}
);
E2E-тест:
cy.visit("/");
cy.get("#country")
.type("Ka");
cy.contains("Kazakhstan")
.should("exist");
Проверяется полный цикл работы интерфейса.
После выбора подсказки значение должно попасть в поле ввода.
Пример Cypress:
cy.get("#country")
.type("Ka");
cy.contains("Kazakhstan")
.click();
cy.get("#country")
.should(
"have.value",
"Kazakhstan"
);
Подобный тест имитирует действия пользователя максимально реалистично.
Многие пользователи практически не используют мышь.
Поэтому необходимы тесты клавиатурного управления.
Пример:
cy.get("#country")
.type("Ka")
.type("{downarrow}")
.type("{enter}");
Проверка результата:
cy.get("#country")
.should(
"have.value",
"Kazakhstan"
);
Предположим, список загружается через API.
Код приложения:
fetch("/countries")
.then(r => r.json())
.then(data => {
awesomplete.list = data;
});
В E2E-тесте желательно перехватывать сетевые запросы.
Пример Cypress:
cy.intercept(
"GET",
"/countries",
[
"Kazakhstan",
"Canada",
"China"
]
);
После этого тест полностью контролирует источник данных.
Настоящие серверы могут:
Поэтому в E2E-тестировании часто используются моки.
Пример:
cy.intercept(
"GET",
"/countries",
{
fixture: "countries.json"
}
);
Преимущества:
Если совпадений нет, список не должен отображаться.
Тест:
cy.get("#country")
.type("ZZZZ");
Проверка:
cy.get(".awesomplete ul")
.should("not.be.visible");
Либо:
cy.get(".awesomplete li")
.should("have.length", 0);
Многие конфигурации используют параметр:
minChars: 3
Тогда список не должен открываться раньше достижения порога.
Проверка:
cy.get("#country")
.type("Ka");
Ожидание:
cy.get(".awesomplete li")
.should("not.exist");
После ввода третьего символа:
cy.get("#country")
.type("z");
Проверка:
cy.get(".awesomplete li")
.should("exist");
Тестирование фильтрации позволяет убедиться в корректной работе поиска.
Исходные данные:
[
"Kazakhstan",
"Canada",
"China"
]
Ввод:
Ca
Ожидаемый результат:
Canada
Тест должен убедиться, что лишние элементы отсутствуют.
Нередко ошибки появляются при вводе специальных символов.
Проверяем:
-
_
'
"
(
)
+
#
@
Пример:
cy.get("#search")
.type("@");
Тест подтверждает отсутствие исключений и зависаний интерфейса.
Современные приложения работают с многоязычными данными.
Примеры значений:
[
"Қазақстан",
"Россия",
"日本",
"العربية"
]
Тесты должны подтверждать корректное отображение и выбор таких элементов.
На мобильных устройствах поведение браузеров может отличаться.
Особенно важно проверять:
Пример Playwright:
const context =
await browser.newContext({
viewport: {
width: 375,
height: 667
}
});
Хотя полноценное нагрузочное тестирование не относится к E2E, некоторые показатели полезно контролировать.
Например:
Пример:
const start = Date.now();
await page.fill(
"#country",
"Ka"
);
await page.waitForSelector(
".awesomplete li"
);
const duration =
Date.now() - start;
Полученное время можно сравнивать с допустимыми пределами.
Flaky-тесты являются одной из главных проблем E2E автоматизации.
Причины:
Нестабильный пример:
await page.fill(
"#country",
"Ka"
);
await page.click(
".awesomplete li"
);
Стабильный вариант:
await page.fill(
"#country",
"Ka"
);
await page.waitForSelector(
".awesomplete li"
);
await page.click(
".awesomplete li"
);
Полное покрытие всех сценариев через браузер обычно приводит к чрезмерно долгому выполнению тестового набора.
Для Awesomplete рационально покрывать E2E-тестами только критические пользовательские пути:
Внутреннюю логику фильтрации, сортировки и обработки событий целесообразно проверять модульными и интеграционными тестами, оставляя E2E-тестам роль финальной проверки работоспособности всей системы глазами пользователя.