Может ли сервер быть одновременно клиентом и сервером
Что проверяют
Понимаете ли вы, что «клиент» и «сервер» это роли в конкретном соединении, а не типы машин. Для тестировщика следом идёт главное: как тестировать сервис с зависимостями и что должно происходить, когда они отказывают.
Как отвечать
Да, и в современных системах это норма. Сервис принимает запрос как сервер и тут же сам идёт как клиент в другие сервисы:
- микросервисы: сервис заказов принимает
POST /ordersи вызывает склад и платёжный шлюз; - API-шлюз и BFF: принимают запросы фронта и собирают ответ из нескольких бэкендов;
- обратный прокси: nginx принимает соединение от браузера и открывает своё к приложению;
- вебхуки: система принимает уведомления от внешнего сервиса и сама вызывает его API.
Дальше переведите ответ в тестирование, ради этого вопрос и задают QA:
- изоляция зависимостей: внешние сервисы подменяют заглушками через WireMock или MockServer, чтобы воспроизвести любой ответ;
- отказы: нижестоящий сервис недоступен, медленный, отдаёт 500 или битый JSON. Наш сервис должен вернуть осмысленный код: 502 при некорректном ответе апстрима, 504 при таймауте, 503 при сработавшем circuit breaker, а не 500 со стектрейсом;
- таймауты и повторы: у каждого исходящего вызова должен быть таймаут, а повтор не должен дважды списать деньги. Проверяют идемпотентность, например по ключу в заголовке запроса;
- контракты: контрактные тесты (Pact) ловят момент, когда поставщик API поменял поле, а потребитель об этом не узнал;
- трассировка: идентификатор запроса или заголовок
traceparentдолжен пройти через всю цепочку, иначе баг в логах не найти.
Где спотыкаются
Отвечают «нет, сервер отвечает, клиент спрашивает» и мыслят машинами. Роль определяется направлением конкретного запроса.
Тестируют только счастливый путь на живых зависимостях. Поведение сервиса при падении соседа так и остаётся непроверенным до первого инцидента.
Не различают 502 и 504 и заводят баг «сервер сломался». Эти коды говорят, что проблема ниже по цепочке, и баг адресуют владельцу зависимости, приложив трассировку запроса.