Из каких модулей состоит микросервис
Что проверяют
Понимаете ли вы, что находится внутри одного сервиса, а что вокруг него, и как это влияет на стратегию тестирования. Интервьюер ждёт связку «слой и способ его проверить». Следом обычно спрашивают, как тестировать сервис, который зависит от трёх других, или как проверить асинхронное взаимодействие.
Как отвечать
Внутри типичного сервиса:
- входной слой: REST-контроллеры, обработчики gRPC, консьюмеры очереди. Здесь валидация, сериализация, коды ответов;
- бизнес-логика: правила предметной области, ради которых сервис существует;
- доступ к данным: репозитории и собственная база. Правило «база на сервис» значит, что соседи не читают его таблицы напрямую;
- интеграции: HTTP-клиенты к другим сервисам, продюсеры в Kafka или RabbitMQ, таймауты и повторы;
- контракт: спецификация OpenAPI или файлы
.proto, схемы событий; - конфигурация и наблюдаемость: настройки из окружения, health-эндпоинты для liveness и readiness в Kubernetes, метрики для Prometheus, структурированные логи, трассировка через OpenTelemetry.
Вокруг, но не внутри: API Gateway, service discovery, брокер сообщений, CI/CD. Это инфраструктура системы.
Теперь покажите, как это ложится на тесты. Бизнес-логика покрывается юнит-тестами. Доступ к данным проверяется интеграционными тестами с настоящей базой в Testcontainers. Соседей подменяют заглушками в WireMock, а совместимость с ними держат контрактными тестами (Pact, Spring Cloud Contract). Для очередей проверяют идемпотентность: сообщение, доставленное дважды, не должно дважды списать деньги. Сквозных тестов через gateway немного, только на ключевые сценарии.
Где спотыкаются
Называют API Gateway и CI/CD модулями микросервиса. Интервьюер услышит, что вы не отличаете сервис от окружения.
Описывают микросервисы с общей базой данных. Это распределённый монолит, и тестировать его части по отдельности не получится.
Забывают про асинхронность: проверяют только HTTP-ответ, хотя результат появляется позже через событие. Отсюда нестабильные тесты с sleep вместо ожидания по условию.