Что такое сквозное тестирование?

Сквозное (end-to-end, E2E) тестирование проверяет, что полный бизнес-процесс работает корректно от начала до конца, как его испытал бы реальный пользователь. В отличие от системного тестирования, которое фокусируется на одном приложении, E2E тестирование охватывает весь технологический стек — фронтенд, бэкенд, базы данных, сторонние сервисы, системы рассылок и любые другие компоненты пользовательского пути.

Когда клиент заказывает товар в интернет-магазине, путь включает:

  1. Просмотр каталога (фронтенд + сервис каталога)
  2. Добавление товаров в корзину (фронтенд + сервис корзины + хранилище сессий)
  3. Ввод данных доставки (фронтенд + API валидации адресов)
  4. Обработка оплаты (фронтенд + сервис оплаты + Stripe/PayPal)
  5. Получение подтверждения (сервис заказов + email-сервис + SMS-провайдер)
  6. Отслеживание доставки (сервис заказов + API перевозчика)

E2E тест симулировал бы весь этот путь, проверяя работу каждого шага и корректность передачи данных между системами.

E2E тестирование vs системное

АспектСистемноеE2E
МасштабОдно приложениеНесколько систем и сервисов
Перспектива«Наше приложение работает?»«Путь пользователя работает?»
Сторонние сервисыЗамокированыРеальные или staging-окружения
Поток данныхВнутри приложенияЧерез границы систем
ОкружениеПриложение + БДПолный стек, как в продакшене
Примеры«Вход работает»«Пользователь регистрируется, подтверждает email, входит и видит дашборд»

Определение критических путей

Поскольку E2E тесты дорогие, нельзя тестировать каждый возможный путь. Ключ — определить критические пути — пользовательские сценарии, наиболее важные для бизнеса.

Пути, критичные для дохода

Потоки, непосредственно генерирующие доход:

  • Полный процесс покупки (просмотр → корзина → оформление → оплата → подтверждение)
  • Регистрация и оплата подписки
  • Активация премиум-функций

Пути, критичные для пользователей

Потоки, которые пользователи выполняют чаще всего:

  • Регистрация и онбординг
  • Использование основных функций (поиск, создание контента, общение)
  • Управление аккаунтом (обновление профиля, сброс пароля)

Пути, критичные по рискам

Потоки, где сбой причинит значительный ущерб:

  • Финансовые транзакции (переводы, возвраты)
  • Операции с данными (экспорт, импорт, удаление аккаунта)
  • Потоки безопасности (двухфакторная аутентификация, управление сессиями)
graph TD START[Пользователь открывает приложение] --> LOGIN[Вход/Регистрация] LOGIN --> BROWSE[Просмотр товаров] BROWSE --> SEARCH[Поиск и фильтрация] SEARCH --> DETAIL[Карточка товара] DETAIL --> CART[Добавить в корзину] CART --> CHECKOUT[Оформление] CHECKOUT --> PAYMENT[Ввод оплаты] PAYMENT --> CONFIRM[Заказ подтверждён] CONFIRM --> EMAIL[Email подтверждения] EMAIL --> TRACK[Отслеживание заказа] style LOGIN fill:#f97316,color:#000 style CHECKOUT fill:#ef4444,color:#000 style PAYMENT fill:#ef4444,color:#000 style CONFIRM fill:#ef4444,color:#000 style EMAIL fill:#f97316,color:#000

Принципы проектирования E2E тестов

Тестирование реального поведения пользователя

E2E тесты должны отражать реальное взаимодействие пользователей:

  • Используйте реалистичные тестовые данные (не «test123» для каждого поля)
  • Следуйте естественным путям навигации
  • Включайте типичные вариации (разные способы оплаты, адреса)

Независимость тестов

Каждый E2E тест должен быть самодостаточным:

  • Создавать собственные тестовые данные
  • Очищать за собой (или использовать изолированные тестовые аккаунты)
  • Запускаться в любом порядке

Один путь на тест

E2E тест должен проверять один полный пользовательский путь, а не несколько несвязанных потоков. Если тест оформления падает, не должно быть сомнений — сбой в навигации, управлении корзиной или оплате.

Проблемы E2E тестирования

Нестабильность (Flakiness)

E2E тесты печально известны нестабильностью — тесты, которые проходят иногда и падают в других случаях без изменений кода.

Типичные причины:

  • Проблемы таймингов: Элементы ещё не загружены при попытке взаимодействия
  • Внешние зависимости: Сторонние API медленные или временно недоступные
  • Конфликты данных: Несколько запусков тестов мешают друг другу
  • Нестабильность окружения: Перезапуск сервисов, бэкапы БД

Стратегии решения:

  • Используйте явные ожидания вместо фиксированных пауз
  • Реализуйте логику повторных попыток для известных нестабильных внешних вызовов
  • Используйте изолированные данные для каждого запуска
  • Мониторьте состояние окружения перед запуском тестов

Медленное выполнение

Один E2E тест может занимать минуты. Полный набор — часы.

Стратегии решения:

  • Параллелизация на несколько браузеров/контейнеров
  • Запуск по расписанию (ночной) вместо каждого коммита
  • Минимальный набор E2E — только критические пути
  • Использование более быстрых альтернатив (API-тесты, интеграционные) где возможно

Высокая стоимость поддержки

При изменении UI тесты ломаются — даже если функциональность не изменилась.

Стратегии решения:

  • Паттерн Page Object для централизации UI-селекторов
  • Атрибуты data-testid вместо CSS-селекторов или XPath
  • Разделение логики теста от деталей реализации
  • Выделение команды инфраструктуры тестирования

Когда использовать E2E vs другие уровни

Используйте E2E тесты для:

  • Проверки критических бизнес-процессов от начала до конца
  • Валидации интеграций со сторонними сервисами
  • Подтверждения межсистемного потока данных
  • Предрелизных smoke-тестов важнейших потоков

НЕ используйте E2E тесты для:

  • Тестирования отдельных функций (используйте модульные тесты)
  • Тестирования взаимодействия компонентов (интеграционные тесты)
  • Тестирования всех возможных сценариев (тесты нижних уровней)
  • Тестирования визуального вида (тесты визуальной регрессии)

Упражнение: Спроектируйте E2E сценарии для оформления заказа

Спроектируйте E2E сценарии для процесса оформления заказа в интернет-магазине. Магазин поддерживает:

  • Оформление гостем и зарегистрированным пользователем
  • Оплата картой и через PayPal
  • Стандартная и экспресс-доставка
  • Применение промокодов
  • Подтверждение заказа по email

Спроектируйте 5 E2E сценариев, покрывающих критические пути. Для каждого укажите: название, предусловия, пошаговые действия и ожидаемый результат.

ПодсказкаПодумайте: Какой самый частый сценарий оформления? Какие способы оплаты популярнее? Что происходит при ошибке (отказ оплаты)? Какие функции взаимодействуют (промокод + оплата)?
Решение

Сценарий 1: Зарегистрированный пользователь — полное оформление картой

  • Предусловия: Аккаунт с сохранённым адресом, товар в наличии
  • Шаги:
    1. Войти в систему
    2. Найти товар
    3. Добавить в корзину (проверить обновление значка)
    4. Перейти в корзину (проверить товар, цену, количество)
    5. Нажать «Оформить заказ»
    6. Выбрать сохранённый адрес
    7. Выбрать «Стандартная доставка»
    8. Ввести карту: 4242-4242-4242-4242
    9. Проверить итого: подитог + доставка
    10. Нажать «Оформить заказ»
  • Ожидаемо: Страница подтверждения, email получен, заказ в «Мои заказы», оплата обработана, остатки уменьшены

Сценарий 2: Гостевое оформление через PayPal

  • Предусловия: Товар в наличии, без авторизации
  • Шаги:
    1. Перейти к товару, добавить в корзину
    2. Нажать «Оформить как гость»
    3. Ввести данные доставки
    4. Выбрать экспресс-доставку
    5. Выбрать PayPal, завершить редирект
    6. Вернуться на страницу подтверждения
  • Ожидаемо: Подтверждение с номером заказа, email отправлен, транзакция PayPal завершена, аккаунт не создан

Сценарий 3: Применение промокода

  • Предусловия: Активный промокод «SAVE20» — 20% скидки, минимум $50
  • Шаги:
    1. Добавить товар за $100 в корзину
    2. Ввести код «SAVE20»
    3. Проверить скидку: -$20
    4. Проверить обновлённый итого
    5. Завершить оформление
  • Ожидаемо: Скидка в подтверждении, email с правильной ценой, списание скидочной суммы

Сценарий 4: Отказ оплаты и повторная попытка

  • Шаги:
    1. Перейти к оформлению
    2. Ввести отклоняемую карту: 4000-0000-0000-0002
    3. Нажать «Оформить» — отображена ошибка
    4. Ввести рабочую карту: 4242-4242-4242-4242
    5. Нажать «Оформить»
  • Ожидаемо: Первая попытка — ясная ошибка, корзина сохранена, вторая попытка успешна, одно списание

Сценарий 5: Заказ нескольких товаров с изменением количества

  • Шаги:
    1. Добавить Товар A (кол-во 2), Товар B (1), Товар C (3)
    2. В корзине: изменить кол-во A на 1, удалить C
    3. Проверить подитог
    4. Завершить оформление
  • Ожидаемо: Корректные суммы на каждом шаге, в заказе только A (1) и B, остатки скорректированы только для заказанных

Архитектура E2E тестирования

Паттерн Page Object

Централизуйте взаимодействия со страницами в выделенных классах:

class CheckoutPage:
    enterShippingAddress(address):
        fill("#street", address.street)
        fill("#city", address.city)

    selectPaymentMethod(method):
        click("#payment-" + method)

    placeOrder():
        click("#place-order-btn")
        waitForURL("/order-confirmation")

При редизайне страницы обновляете один класс, а не 50 тестов.

Управление тестовыми данными

Создавайте выделенные тестовые аккаунты и наборы данных:

  • Уникальные email для каждого запуска (timestamps или UUID)
  • Предзаполненный каталог товаров с известными ценами
  • Тестовые платёжные данные (тестовые карты Stripe, sandbox PayPal)
  • Скрипты очистки после каждого набора тестов

Профессиональные советы

Совет 1: Чем меньше E2E тестов, тем лучше. Каждый добавленный E2E тест увеличивает нагрузку на поддержку. Спросите: «Можно ли это проверить на более низком уровне?» Если да — не делайте E2E.

Совет 2: Обращайтесь с нестабильными тестами как с багами. Нестабильный тест хуже отсутствия теста — он разрушает доверие ко всему набору. При нестабильности — исправьте немедленно или удалите.

Совет 3: Записывайте доказательства. Настройте E2E тесты на захват скриншотов и видео при сбое. Когда тест падает в CI, нужно видеть именно то, что увидел бы пользователь.

Ключевые выводы

  • E2E тестирование валидирует полные пользовательские сценарии через весь технологический стек
  • Фокусируйтесь на критических путях: генерирующих доход, наиболее используемых и рискованных
  • E2E тесты медленные, нестабильные и дорогие — используйте экономно и стратегически
  • Проблемы: нестабильность, медленное выполнение, высокая стоимость поддержки
  • Паттерн Page Object и изолированные данные снижают нагрузку на поддержку
  • Каждый нестабильный тест — баг, который нужно исправить для поддержания доверия