Как проверить ограничения каждого поля в ответе API, включая пустые и максимальные значения
Что проверяют
Умеете ли вы превратить контракт API в проверяемую схему, а не писать условие на каждое поле руками. Интервьюер смотрит, различаете ли вы отсутствующий ключ, null и пустую строку. Следом обычно спрашивают, как получить в ответе максимальные значения, если ответ формирует сервер.
Как отвечать
Каркас на Python-стеке:
- источник правил: спецификация OpenAPI или договорённость с бэкендом. Ограничения берутся оттуда, а не придумываются в тесте;
- схема: модель на pydantic v2 с декларативными правилами:
Field(min_length=1, max_length=50),Field(ge=0, le=120),Literalдля перечислений. Проверка укладывается вModel.model_validate_json(resp.text), аValidationErrorсама перечислит все нарушенные поля. Альтернатива:jsonschemaи схема из спецификации; - строгость: по умолчанию pydantic приводит типы и примет
"30"как число. Для проверки ответа включитеConfigDict(strict=True), иначе тест пропустит ошибку сериализации; - пустые значения: отдельные кейсы для отсутствующего ключа,
null,""и[]. В pydantic v2 полеstr | Noneбез значения по умолчанию обязано присутствовать, но может бытьNone; - максимумы: чтобы сервер вернул строку длиной 50, её надо сначала создать через API или фикстуру в базе, затем прочитать и сравнить. Смотрите, не обрезана ли она и считаются ли эмодзи и кириллица символами, а не байтами;
- генерация:
pytest.mark.parametrizeдля граничных наборов,hypothesisдля случайных данных иschemathesis, который строит тесты из OpenAPI и ловит ответы, не совпадающие со схемой.
Где спотыкаются
Пишут if not value для проверки обязательности. Такое условие считает отсутствующими 0, False и пустой список, и поле age: 0 падает как незаполненное.
Проверяют число через isinstance(value, int). В Python bool наследуется от int, поэтому True пройдёт проверку на возраст. Нужен явный отказ от bool или строгая схема.
Тестируют только на заранее подготовленных типичных данных. Ограничение, которое ни разу не упёрлось в границу, ничего не доказывает: без записи максимальных и пустых значений схема подтверждает лишь то, что сервер умеет вернуть обычного пользователя.