Как проверять корректный статус и тело ответа при валидных и невалидных данных
Что проверяют
Умеете ли вы писать проверки API так, чтобы тест ловил реальные расхождения с контрактом, а не только «пришло 200». Следом обычно спрашивают, чем 400 отличается от 422 и как убедиться, что после ошибки в базе ничего не записалось.
Как отвечать
Начните с того, что статус и тело проверяются вместе: код без тела пропустит ответ с пустым списком, тело без кода пропустит ошибку, завёрнутую в 200. Каркас на Python:
- инструмент:
pytestплюсrequestsилиhttpxдля внешнего сервиса; для своего FastAPI удобнееTestClient, он гоняет приложение без сети; - валидные данные: точный ожидаемый код (
201на создание,200на чтение,204без тела), затем схема ответа через модельpydanticилиjsonschemaи конкретные значения полей, которые вы отправили; - невалидные данные: набор кейсов через
@pytest.mark.parametrize, каждый ломает одно правило: пропущено обязательное поле, неверный тип, пустая строка, значение за границей. Проверяйте код (FastAPI по умолчанию отвечает422, многие API договариваются о400), структуру ошибки и то, что в ней названо именно проблемное поле; - побочные эффекты: после невалидного запроса сущность не должна появиться, проверьте это отдельным
GETили запросом в базу; - заголовки:
Content-Type: application/jsonиLocationпри создании, если контракт его обещает.
Сообщение к проверке добавляйте сразу: assert resp.status_code == 201, resp.text при падении покажет тело ответа, и гадать, что пошло не так, не придётся.
Где спотыкаются
Проверяют данные на клиенте до отправки и считают это тестом невалидных данных. Так тестируется ваш скрипт, а не сервер: запрос с плохими данными надо именно отправить и посмотреть, как API его отвергнет.
Пишут if response.status_code == 200: print(...) вместо assert. Такой тест никогда не падает. А raise_for_status() в негативном тесте уронит проверку исключением вместо сравнения с ожидаемым кодом.
Сравнивают тело целиком со снимком, включая id и дату создания. Тест падает на каждом прогоне, и его отключают. Нестабильные поля проверяют по типу или формату, а не по значению.