Как реализовать тестирование микросервисов, включая юнит и интеграционные тесты?
Что проверяют
Понимаете ли вы уровни тестирования в распределённой системе и где проходит зона ответственности QA. Следом обычно спрашивают, как тестировать асинхронное взаимодействие через брокер и как не зависеть от нестабильного общего стенда.
Как отвечать
Постройте ответ вокруг пирамиды, адаптированной под микросервисы:
- юнит-тесты: логика внутри сервиса без сети и базы, пишут их в основном разработчики (JUnit 5, pytest). От QA ждут понимания, что ими покрыто, чтобы не дублировать проверки выше;
- компонентные тесты: один сервис целиком, внешние зависимости заменены заглушками WireMock или MockServer. Так проверяются тайм-ауты, ошибки 500 от соседа, повторы;
- интеграционные тесты: сервис с настоящими PostgreSQL, Kafka или Redis, поднятыми через Testcontainers. Проверяются миграции, запросы, сериализация сообщений;
- контрактные тесты: Pact или Spring Cloud Contract фиксируют, что потребитель ждёт от поставщика, и ломают сборку поставщика, если он нарушил контракт. Это главная защита от расхождения моков с реальностью;
- E2E: немного сценариев по ключевым бизнес-процессам, потому что они медленные и хрупкие.
Инструменты для API-проверок: RestAssured или pytest с httpx, валидация ответа по JSON Schema. В асинхронных сценариях не ждите фиксированной паузой: опрашивайте результат с тайм-аутом через Awaitility в Java или цикл с повтором в Python. Тестовые данные создавайте в самом тесте и чистите за собой, а падение ищите в логах по сквозному trace id. Всё это запускается в CI: юнит и компонентные тесты на каждый коммит, интеграционные и контрактные на merge request, E2E по расписанию или перед релизом.
Где спотыкаются
Строят стратегию только на E2E через UI. Такой набор идёт часами, падает от любого сбоя стенда и не показывает, какой сервис сломан.
Ставят Thread.sleep(5000) для асинхронных операций. На быстром стенде тест тратит время впустую, на медленном падает.
Мокают соседа по своему представлению об API и не сверяют заглушку с реальным сервисом. Тесты зелёные, а в проде падает интеграция; эту дыру и закрывают контрактные тесты.