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

«В чем разница между end-to-end (E2E) и системным тестированием?» — вопрос из категории Основы тестирования, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Системное тестирование — это проверка интегрированной системы в целом на соответствие функциональным и нефункциональным требованиям. Оно выполняется в среде, максимально приближенной к боевой, но может использовать заглушки (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();
});