Как устроен типичный e-commerce: монолит, микросервисы и headless-архитектура · 12 мин
🎯 Цель урока

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

Контекст

Прежде чем писать тест-кейсы для e-commerce, QA-инженер должен понять, с какой архитектурой он работает — это кардинально меняет подход к тестированию. Монолитная архитектура объединяет все компоненты (каталог, корзина, оплата, профиль) в одном приложении: это упрощает сквозное тестирование, но любое изменение в одной части может сломать другую. Микросервисная архитектура разбивает магазин на независимые сервисы — каждый со своей базой данных и API; здесь QA фокусируется на контрактном тестировании между сервисами и изоляции ошибок. Headless-архитектура отделяет frontend от backend: CMS или PIM управляет контентом, а frontend-приложение получает данные через API; такой подход увеличивает количество интеграционных точек и требует особого внимания к согласованности данных между слоями.

  • Монолит: единая кодовая база, один деплой, высокая связность компонентов — тестирование через UI-сценарии и сквозные E2E-тесты.
  • Микросервисы: каждый сервис (catalogue, cart, checkout, auth, notification) деплоится независимо — требуется контрактное тестирование (Pact, OpenAPI).
  • Headless: CMS/PIM на бэкенде, произвольный frontend через API — тестируются как API-ответы, так и корректность рендеринга данных на фронте.
  • Гибридный подход: многие зрелые магазины переходят с монолита на микросервисы постепенно — QA должен понимать, какая часть уже вынесена, а какая ещё монолитна.
  • Платформы (Shopify, Magento, 1С-Битрикс) имеют собственную архитектуру — QA должен знать, где платформа берёт на себя логику, а где — кастомный код команды.

Рабочий алгоритм

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

  • Шаг 1. Запросить у команды архитектурную диаграмму или нарисовать её самостоятельно на основе репозиториев и документации.
  • Шаг 2. Определить границы сервисов: что за что отвечает, какие данные передаются между компонентами и через какие протоколы (REST, GraphQL, gRPC, очереди).
  • Шаг 3. Составить матрицу интеграций: какие внешние системы подключены (платёжный шлюз, ERP, почтовый провайдер) и через какие точки входа.
  • Шаг 4. Для монолита — приоритизировать сквозные E2E-сценарии по критическим пользовательским путям (поиск → карточка → корзина → оплата).
  • Шаг 5. Для микросервисов — добавить уровень контрактного тестирования для каждого межсервисного вызова и проверить поведение при падении зависимого сервиса.
  • Шаг 6. Для headless — тестировать API и UI независимо: убедиться, что данные из CMS корректно трансформируются и отображаются на фронте без потерь и искажений.

Пример из практики

Команда QA пришла в проект миграции крупного fashion-ретейлера с монолита Magento на микросервисную архитектуру. На старте казалось, что достаточно перенести существующие E2E-тесты. Однако уже при первом анализе выяснилось, что сервис корзины и сервис каталога общаются через очередь сообщений RabbitMQ, а значит, добавление товара в корзину — это асинхронная операция. Существующие тесты падали из-за гонки условий: UI показывал успех, но данные ещё не были записаны в базу сервиса корзины. Команда переработала стратегию: добавили polling на уровне API-тестов, написали контрактные тесты для каждой пары producer-consumer и внедрили тестирование поведения при недоступности сервиса.

  • Асинхронные операции между микросервисами требуют poll/retry стратегий в тестах, а не простого ожидания по времени.
  • Контрактное тестирование (Pact) позволило обнаружить несовместимость версий API между cart-service и checkout-service ещё до деплоя.
  • Тестирование деградации (один сервис упал) показало: UI не обрабатывал ошибки и показывал пустой экран вместо понятного сообщения.
  • Итог: отдельная тест-матрица для каждого сервиса плюс сквозные smoke-тесты на интеграционном стенде после каждого деплоя.

Частые ошибки

QA-инженеры, не разобравшиеся в архитектуре системы, систематически совершают одни и те же ошибки — и теряют время на поиск дефектов не там, где они реально находятся.

  • Тестировать монолит как набор независимых модулей — игнорировать боковые эффекты изменений в смежных компонентах.
  • В микросервисной архитектуре проверять только UI, не проверяя API-контракты — дефекты на стыке сервисов остаются необнаруженными до продакшена.
  • В headless-архитектуре считать, что «данные правильные в CMS — значит, всё правильно на сайте», не проверяя трансформацию и рендеринг.
  • Не учитывать асинхронность при написании тестов — тесты нестабильны и дают ложные падения, которые команда начинает игнорировать.
  • Игнорировать поведение системы при частичных сбоях (circuit breaker, fallback) — это критично для e-commerce в периоды пиковых нагрузок.

Самопроверка

1Чем отличается стратегия тестирования монолитного e-commerce от микросервисного?
В монолите основной упор делается на сквозные E2E-тесты и регрессию компонентов, которые меняются совместно. В микросервисах добавляется уровень контрактного тестирования (Pact, Schema Registry) для проверки совместимости API между сервисами, а также тесты на поведение при деградации — когда один из сервисов недоступен. Кроме того, в микросервисах важно учитывать асинхронность операций при написании тестов.
2Что такое headless-архитектура и какие специфические риски она создаёт для QA?
Headless-архитектура разделяет backend (CMS, PIM, OMS) и frontend, которые общаются через API. Специфические риски: данные могут корректно храниться в CMS, но неправильно трансформироваться или рендериться на фронте; изменения схемы API в backend могут не сразу отразиться на frontend; кеширование на нескольких уровнях (CDN, API-gateway, frontend-cache) создаёт риск отображения устаревших данных.
3Почему QA-инженеру важно знать протоколы взаимодействия между сервисами?
Протокол определяет подход к тестированию: для синхронных REST/GraphQL-вызовов тесты можно писать в классическом стиле request-response. Для асинхронных очередей (RabbitMQ, Kafka) нужны poll/retry стратегии и отдельные проверки состояния очереди. Неправильное понимание протокола приводит к нестабильным тестам, пропущенным дефектам гонки условий и неверной диагностике падений в CI/CD.