Как смоделировать отсутствие ответа от стороннего сервиса
Что проверяют
Различаете ли вы виды «нет ответа» и понимаете ли, что ошибка 500 и молчание сервиса ведут систему по разным веткам кода. Следом спрашивают, что именно вы проверите в поведении системы, кроме того, что она «не упала».
Как отвечать
Начните с классификации, каждый сценарий ловит свой дефект:
- таймаут соединения: хост не отвечает на подключение. Воспроизводится обращением на немаршрутизируемый адрес или правилом файрвола, которое молча отбрасывает пакеты;
- таймаут чтения: соединение установлено, запрос принят, ответа нет. Самый коварный случай, клиент без настроенного таймаута висит бесконечно;
- медленный ответ: ответ приходит через 20 секунд, когда клиент уже сдался и, возможно, отправил повтор;
- обрыв: соединение сброшено посреди ответа или пришли мусорные данные.
Инструменты: в WireMock withFixedDelay() для задержки и withFault() с Fault.CONNECTION_RESET_BY_PEER или Fault.EMPTY_RESPONSE для обрывов; Toxiproxy между сервисами с токсиками latency, timeout, reset_peer; для мобильных и веб-клиентов Charles или mitmproxy с брейкпоинтами и троттлингом, в браузере DevTools с режимом Offline и блокировкой запросов. На стенде в Docker зависимость можно заморозить через docker pause: соединение устанавливается, а ответа нет.
Что проверять: какой таймаут реально сработал и совпадает ли он с требованием, сколько было ретраев и с какой паузой, не создал ли повтор дубль платежа или заказа, что увидел пользователь (понятное сообщение, а не вечный спиннер), что попало в логи и как система восстановилась, когда сервис вернулся.
Где спотыкаются
Моделируют только быстрый ответ 500. Он проходит по ветке обработки ошибок, а зависание идёт совсем другим путём, и именно его обычно никто не проверял.
Не проверяют идемпотентность повторов. Клиент не дождался ответа и повторил запрос, а первый на самом деле дошёл: у пользователя два списания.
Забывают про возврат сервиса. Circuit breaker остался открытым, очередь не разобралась, кэш отдаёт устаревшие данные, хотя зависимость давно жива.