Анализ ошибки 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 ошибка для конкретного эндпоинта — это классический симптом того, что контракт изменился, а автотест об этом не знает.
Анатомия упавшего запроса
Давайте препарируем запрос, на котором упал наш тест:
GET https://aeqs-ticket.dev.aeqs.corp.dev.vtb/v1/apt/ticket/create
Чтобы понять, где произошел разрыв связи, переведем этот URL на язык привычного вам 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). - Гипотеза изменения базового пути (Context Path): Изменилась глобальная настройка сервиса, и теперь все запросы должны начинаться с
/v2/или/api/v1/. - Гипотеза изменения конфигурации хоста: Сервис переехал, и нам нужно обновить базовый URL в конфигурации наших автотестов.
В следующей главе мы разберем, как именно запрос путешествует от нашего Java-теста до сервиса aeqs-ticket, чтобы понять, в каких именно файлах разработчиков искать ответы на эти гипотезы.