В чем разница между end-to-end (E2E) и системным тестированием?

Ответ

Системное тестирование — это проверка интегрированной системы в целом на соответствие функциональным и нефункциональным требованиям. Оно выполняется в среде, максимально приближенной к боевой, но может использовать заглушки (mocks/stubs) для внешних зависимостей.

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

Ключевые отличия:

Критерий Системное тестирование E2E-тестирование
Объем Вся система как единое целое. Сквозной пользовательский сценарий через все слои и системы.
Зависимости Может использовать заглушки для внешних сервисов. Всегда использует реальные внешние сервисы и интеграции.
Цель Проверить, что система соответствует спецификациям. Проверить, что бизнес-процесс работает корректно для конечного пользователя.
Пример Проверка API-метода создания заказа (с моком платежного шлюза). Полный сценарий: пользователь выбирает товар, оформляет заказ, проходит оплату, получает уведомление.

Пример E2E-теста (Playwright):

import { test, expect } from '@playwright/test';

test('complete user purchase flow', async ({ page }) => {
  await page.goto('https://shop.example.com');
  await page.click('text="Add to Cart"');
  await page.click('data-testid=cart-icon');
  await page.click('text="Checkout"');
  await page.fill('#card-number', '4242424242424242');
  await page.click('text="Pay"');
  await expect(page.locator('text="Order Confirmed"')).toBeVisible();
});

Ответ 18+ 🔞

Да ты посмотри, какая хуйня развелась в тестировании! Сидят, блядь, термины плодят, как кролики. Ну ладно, разбираться надо, а то потом на проекте такой пиздец начнётся, что мама не горюй.

Вот, например, системное тестирование. Это когда ты, сука, взял всю свою сборку, эту гору кода, которая уже вроде как склеена, и начинаешь её пинать, как тупую скотину. Проверяешь, работает ли она вообще как единый организм, а не как набор отдельных, блядь, запчастей. Требования вот эти, на бумажке — выполняются? Да? Ну и славно. Можно и заглушки воткнуть, если какой-нибудь внешний сервис — пидарас шерстяной — лежит. Главное — система в себе.

А теперь, внимание, ёпта, End-to-End (E2E). Это уже не просто пинание, а целое цирковое представление! Это подвид системного, но такой, блядь, максималистский. Тут уже никаких заглушек, нахуй! Всё должно быть по-настоящему, как у взрослых. База данных — настоящая, платёжный шлюз — живой, почтовый сервер — чтоб письма реально летели. Цель — пройти весь путь, как самый тупой, но самый настоящий пользователь. От нажатия кнопки "купить" до получения "спасибо за покупку" в почте. Если где-то в этой цепочке хоть одно звено — говно, то весь сценарий, блядь, накрывается медным тазом.

Короче, в чём разница, чтобы в голове не еблось:

Критерий Системное тестирование E2E-тестирование
Что тестим Всю систему разом, но можно в вакууме. Полный сценарий от и до, в реальных декорациях.
Зависимости Можно натыкать заглушек, моков, стабов — было бы удобно. НИКАКИХ ЗАГЛУШЕК! Всё настоящее, блядь, даже если это тормозит как черепаха.
Зачем Убедиться, что система не разваливается и делает то, что в ТЗ написано. Убедиться, что реальный пользователь сможет сделать то, зачем он, собственно, пришёл.
На примере API создания заказа вызвали, ответ получили — ок. Платёжку забили болтом. Человек зашёл на сайт, тыкнул в товар, в корзину, оплатил картой, получил письмо. ВСЁ.

Вот тебе пример, как этот E2E выглядит в коде (Playwright):

import { test, expect } from '@playwright/test';

test('complete user purchase flow', async ({ page }) => {
  await page.goto('https://shop.example.com');
  await page.click('text="Add to Cart"');
  await page.click('data-testid=cart-icon');
  await page.click('text="Checkout"');
  await page.fill('#card-number', '4242424242424242');
  await page.click('text="Pay"');
  await expect(page.locator('text="Order Confirmed"')).toBeVisible();
});

Видишь? Полный путь, от открытия сайта до подтверждения заказа. Если где-то сбой — значит, вся цепочка, блядь, не работает. Вот и вся философия. E2E — это проверка не на "работает ли код", а на "сможет ли живой человек этим воспользоваться, не разнеся вдребезги свой монитор".