1. Анализ ошибки 503 и первичная диагностика причин падения теста в проекте aeqs
Анализ ошибки 503 и первичная диагностика причин падения теста в проекте aeqs
Вы запускаете автотесты в репозитории aeqs-qa-autotest, ожидая увидеть зеленую галочку успешного создания талона, но вместо этого консоль выдает красный текст: 503 Service Temporarily Unavailable. Первая мысль ручного тестировщика: «Стенд упал, пойду попью кофе». Но стенд работает, соседние тесты проходят, а Swagger открывается. Значит, проблема не в том, что сервер физически выключен. Проблема в том, что наш автотест стучится в дверь, которой больше не существует, или пытается войти не через тот вход.
Чтобы починить тест, нам предстоит залезть в код разработчиков сервиса aeqs-ticket. Но прежде чем открывать чужой репозиторий, нужно четко понять, что именно мы будем там искать.
О чем на самом деле говорит статус 503
Как QA-инженер, вы привыкли работать с вкладкой Network в DevTools. Давайте вспомним, как выглядят типичные ошибки:
* 404 Not Found: Запрос дошел до приложения, контроллер понял, чего вы хотите, но не нашел нужную запись в базе данных (например, талон с таким ID не существует). * 500 Internal Server Error: Запрос дошел до приложения, контроллер начал работу, но внутри кода произошел сбой (например, NullPointerException в Java). * 503 Service Unavailable: Запрос ушел из автотеста, но вообще не дошел до бизнес-логики приложения.
> Ошибка 503 в контексте микросервисов чаще всего означает, что балансировщик нагрузки или API-шлюз (Gateway) получил ваш запрос, посмотрел на него и не смог найти живой сервис, который готов этот запрос обработать. > > — Базовый принцип сетевой маршрутизации
Если стенд в целом жив, то 503 ошибка для конкретного эндпоинта — это классический симптом того, что контракт изменился, а автотест об этом не знает.
!Механизм возникновения ошибки 503 на шлюзе
Анатомия упавшего запроса
Давайте препарируем запрос, на котором упал наш тест:
GET https://aeqs-ticket.dev.aeqs.corp.dev.vtb/v1/apt/ticket/create
Чтобы понять, где произошел разрыв связи, переведем этот URL на язык привычного вам Postman. Запрос состоит из трех критически важных частей, любая из которых могла измениться.
!Анатомия API-запроса в сравнении с Postman
1. Хост (Окружение)
https://aeqs-ticket.dev.aeqs.corp.dev.vtbВ Postman это обычно скрыто за переменной окружения, например {{base_url}}. Хост указывает, на какой конкретно сервер (или кластер) нужно отправить запрос. В микросервисной архитектуре имя сервиса часто зашито прямо в URL. Если инфраструктурная команда переименовала сервис или перенесла его на другой кластер, старый хост перестанет отвечать, и шлюз вернет 503.
2. Путь (Роутинг)
/v1/apt/ticket/createВ Postman это то, что вы пишете в строке запроса рядом с методом. Путь — это точный адрес метода внутри приложения. Он делится на базовый путь сервиса (/v1/apt/) и специфичный эндпоинт (/ticket/create). Если разработчики выпустили вторую версию API, путь мог измениться на /v2/apt/....
3. HTTP-Метод
GETЭто выпадающий список слева от URL в Postman. И здесь кроется главная зацепка нашего кейса.
Создание сущности (талона) через метод GET — это архитектурный антипаттерн (code smell). Метод GET предназначен для получения данных, он не должен изменять состояние системы. Для создания традиционно используется POST. Очень вероятно, что разработчики провели рефакторинг, привели API к стандартам REST и изменили метод на POST, убрав слово create из пути.
Формируем гипотезы для "Белого ящика"
В парадигме «черного ящика» (когда мы тестируем только через интерфейсы) при такой ошибке мы бы пошли дергать разработчика или искать обновленный Swagger. Но Swagger обновляется не всегда синхронно с кодом, а разработчик может быть занят.
В парадигме «белого ящика» мы берем инициативу в свои руки. У нас есть доступ к репозиторию aeqs-ticket. На основе анализа запроса мы формулируем три гипотезы, которые пойдем проверять прямо в исходном коде:
GET на POST и/или поменяли сам путь (например, на POST /v1/apt/ticket)./v2/ или /api/v1/.В следующей главе мы разберем, как именно запрос путешествует от нашего Java-теста до сервиса aeqs-ticket, чтобы понять, в каких именно файлах разработчиков искать ответы на эти гипотезы.