Что такое End-to-End (E2E) тестирование?

Ответ

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

Ключевые особенности:

  • Объём: Охватывает все интегрированные компоненты (UI, бэкенд, БД, внешние сервисы).
  • Цель: Проверка целостных бизнес-сценариев, а не отдельных модулей.
  • Недостатки: Тесты медленные, хрупкие (чувствительны к изменениям UI) и сложные в поддержке по сравнению с модульными (unit) или интеграционными тестами.

Пример сценария на Cypress:

describe('Покупка товара', () => {
  it('пользователь может добавить товар в корзину и оформить заказ', () => {
    cy.visit('/catalog');
    cy.get('[data-testid="product-card"]').first().click();
    cy.get('[data-testid="add-to-cart-button"]').click();
    cy.visit('/cart');
    cy.contains('Оформить заказ').click();
    cy.get('#email').type('user@example.com');
    cy.get('button[type="submit"]').click();
    cy.url().should('include', '/success');
    cy.contains('Заказ подтверждён');
  });
});

Когда использовать: Для проверки критически важных пользовательских потоков, таких как регистрация, вход или оформление заказа.

Ответ 18+ 🔞

Ну вот, опять про эти ваши тесты. Слушай, представь себе картину: ты собрал тачку, деталь к детали, всё по мануалу, каждый винтик на своём месте. И вот ты садишься за руль, ключ на старт — и она, сука, не едет. А почему? Потому что в реальности-то не по мануалу живём, блядь! Вот это и есть E2E-тестирование — не просто кнопку тыкнуть, а всю дорогу проехать, от гаража до съёба, и посмотреть, не отвалится ли колесо по пути.

В чём соль, а?

  • Размах: Берётся всё приложение целиком — эта красивая мордашка (UI), вся кухня с логикой на бэкенде, база данных, которая иногда тупит, и даже сторонние сервисы, которые могут в любой момент накрыться медным тазом. Всё это хозяйство запускается и проверяется как единый, ебаный организм.
  • Суть: Не просто "а работает ли эта функция сложения двух чисел", а "а может ли реальный юзверь, слегка поддатый, в три часа ночи заказать себе пиццу с ананасами, оплатить её левой картой и получить смс, что курьер уже у подъезда?". Проверяются целые жизненные сценарии, блядь.
  • Подводные камни: А вот тут, ёпта, начинается веселье. Такие тесты — они как капризная барышня: медленные (кофе успеешь сварить), хрупкие (дизайнер поменял кнопку с синей на голубую — всё, пиздец тестам), и сложные в уходе (поддерживать их — тот ещё геморрой). По сравнению с юнит-тестами, которые щёлкают как орешки, это как сравнивать велосипед с космическим кораблём.

Вот, смотри, как это может выглядеть в коде (Cypress, например):

describe('Покупка товара', () => {
  it('пользователь может добавить товар в корзину и оформить заказ', () => {
    cy.visit('/catalog'); // Зашли в магазин
    cy.get('[data-testid="product-card"]').first().click(); // Тыкнули в первую попавшуюся хуйню
    cy.get('[data-testid="add-to-cart-button"]').click(); // Сунули её в корзину
    cy.visit('/cart'); // Пошли на кассу
    cy.contains('Оформить заказ').click(); // Нажали "всё, пиздец, деньги уносите"
    cy.get('#email').type('user@example.com'); // Вписали свою мыло
    cy.get('button[type="submit"]').click(); // И бабахнули по "оплатить"
    cy.url().should('include', '/success'); // Проверяем, что нас не кинули и выкинули на страницу успеха
    cy.contains('Заказ подтверждён'); // И видим заветную надпись
  });
});

Так когда же эту дурилку включать? Да тогда, когда на кону самое важное! Регистрация нового клиента, вход в систему (чтобы не получилось, что все вдруг стали анонимами), ну и святое — процесс отдавания денег, то есть оформление заказа. Если это сломается — бизнес накрывается тазом. Вот для таких, блядь, моментов и нужны эти монструозные, но такие необходимые E2E-тесты. Чтобы не было мучительно больно, когда в продкшн выкатишь какую-нибудь дичь.