Какие особенности учитывать при тестировании внешних интеграций
Что проверяют
Понимаете ли вы, что внешняя система живёт своей жизнью: отвечает медленно, падает, меняет формат и присылает дубли. Интервьюеру важно, умеете ли вы проверять поведение своего продукта на этих отказах. Следом обычно спрашивают, как тестировать, если у партнёра нет тестового стенда.
Как отвечать
Разложите проверки по слоям:
- контракт: сверка запросов и ответов со спецификацией (OpenAPI, JSON Schema) и контрактные тесты, например Pact. Отдельно поля, которые приходят
null, пустыми или новыми, неизвестными клиенту; - песочница провайдера: нужна для сквозных сценариев, но ведёт себя не как прод: другие лимиты, тестовые карты, упрощённые ответы;
- заглушки: WireMock или MockServer на уровне HTTP воспроизводят то, чего от песочницы не добиться: 500, 503, 429 с
Retry-After, таймаут, обрыв соединения, битый JSON, ответ через 30 секунд; - таймауты и повторы: есть ли таймаут на клиенте, повторяются ли только идемпотентные операции, передаётся ли ключ идемпотентности в платёжных запросах, срабатывает ли circuit breaker;
- вебхуки: повторная доставка, дубли, другой порядок, проверка подписи. Обработчик должен быть идемпотентным;
- данные: кодировки, часовые пояса, формат дат, округление сумм, лимиты длины полей;
- авторизация: истёкший токен, обновление, отозванный ключ;
- наблюдаемость: в логах есть запрос, ответ и идентификатор корреляции, но нет токенов и персональных данных.
Если внешнего стенда нет, так и скажите: основную массу покрываете заглушками по контракту, а против реального API держите небольшой набор проверок, который регулярно показывает, не разошлась ли заглушка с оригиналом.
Где спотыкаются
Проверяют только успешный путь в песочнице. В проде первыми ломаются как раз таймауты и ответы 429.
Пишут заглушку один раз и забывают. Через полгода провайдер меняет формат, а тесты зелёные, потому что проверяют заглушку, а не интеграцию.
Не проверяют повторы. Ретрай неидемпотентного запроса даёт двойное списание, повторный вебхук даёт двойное начисление бонусов.