Что такое e2e тесты и что они делают
Что проверяют
Понимаете ли вы, что сквозные тесты это самый дорогой и самый хрупкий слой проверок, и умеете ли решать, что в него класть. Для фронтендера это вопрос про инженерный вкус: чем покрывать пользовательский сценарий, а чем отдельный компонент.
Как отвечать
Сквозной тест поднимает приложение целиком и проходит сценарий через браузер: клики, ввод, ожидание отрисовки, проверка того, что видит пользователь. В отличие от модульных и компонентных тестов он не знает про внутренности и ловит поломки на стыках: сборка, маршрутизация, контракт с бэкендом, авторизация.
Дальше стоит развернуть по пунктам:
- место в пирамиде: модульных тестов много, компонентных меньше, сквозных единицы и только на критические пути;
- что проверяем: наблюдаемый результат на экране, а не состояние стора или число запросов;
- селекторы: роль и видимый текст либо отдельный атрибут для тестов, но не классы вёрстки;
- ожидания вместо пауз: ждём появления элемента или ответа сети, фиксированная задержка это будущая нестабильность;
- данные: пользователь и его состояние создаются через API, а не кликами в интерфейсе;
- запуск в конвейере на каждое изменение, с сохранением трассировки, видео и скриншота;
- инструменты: Playwright и Cypress для современных проектов, Selenium там, где нужна широкая матрица браузеров.
Где спотыкаются
Повторяют тезис, будто сквозные тесты ловят дефекты рано и потому экономят деньги. Наоборот: этот слой находит проблему позже всех, на собранном приложении, и диагностика падения самая дорогая. Ценность у него другая, он единственный проверяет систему так, как её видит пользователь.
Пытаются покрыть сквозными тестами всё подряд, включая валидацию полей и граничные случаи. Прогон разрастается до десятков минут, падения становятся фоновым шумом, и команда привыкает игнорировать красную сборку. Граничные случаи дешевле и точнее закрываются на уровне компонента.
Борются с нестабильностью повторными прогонами и паузами. Повтор прячет гонку, из-за которой тест кликает по ещё не смонтированному элементу, а пауза просто замедляет прогон. Лечится это ожиданием конкретного условия, изоляцией данных и отказом от зависимости одного сценария от другого.