Как спроектировать подход к тестированию микросервисного приложения с нуля
Что проверяют
Умеете ли вы мыслить стратегией, а не списком инструментов: какие риски у микросервисов, на каком уровне их ловить и кто за какой уровень отвечает. Следом обычно спрашивают, как узнать до деплоя, что один сервис сломал другой, изменив API.
Как отвечать
Начните с разведки: сколько сервисов, как они общаются (REST, gRPC, Kafka), какие бизнес-потоки критичны, есть ли CI и окружения. Дальше слои:
- юнит-тесты: пишут разработчики, QA договаривается о покрытии критичной логики;
- компонентные тесты: сервис поднимается целиком, база и брокер в Testcontainers, соседи заменены заглушками WireMock. Основная масса проверок: быстро и без общего стенда;
- контрактные тесты: consumer-driven контракты в Pact. Потребитель фиксирует нужные ему поля и ответы, провайдер проверяет контракт в своём пайплайне, ломающее изменение API ловится до деплоя;
- сквозные сценарии: несколько ключевых бизнес-потоков на собранном окружении, не больше. Они дорогие и нестабильные;
- асинхронность: сообщение ушло с правильной схемой, потребитель обработал его один раз. Результат ждут опросом с таймаутом (Awaitility в Java), а не фиксированной паузой;
- нефункциональное: нагрузка на k6, Gatling или JMeter, поведение при отказе соседа: таймауты, ретраи, circuit breaker;
- наблюдаемость: сквозной trace id через OpenTelemetry и централизованные логи, чтобы падение теста быстро связывалось с конкретным сервисом.
Закончите организацией: тесты в пайплайне каждого сервиса, временные окружения на пул-реквест, где это возможно, управление тестовыми данными.
Где спотыкаются
Строят всё на сквозных тестах через общий стенд. Стенд занят, данные чужие, тесты падают из-за сервиса, который никто не трогал, и команда перестаёт им верить.
Не упоминают контрактное тестирование. Без него главная боль микросервисов, несовместимость API между командами, всплывает только на интеграции или в проде.
Проверяют асинхронные потоки через sleep(5). На медленном CI этого мало, на быстром это пустая трата времени.