Что должно произойти, чтобы тело HTTP запроса и тела ответа совпали
Что проверяют
Понимаете ли вы, что именно сравниваете, когда пишете автотест на ответ ручки. Вопрос звучит как загадка, а проверяют знание того, в каких случаях сервер возвращает присланное представление и почему побайтовое совпадение тел почти не встречается.
Как отвечать
Тела совпадут, когда сервер отдаёт обратно то же представление ресурса, что получил, и ничего своего не добавляет. На практике это:
- отладочная эхо-ручка, она возвращает запрос как есть;
PUTкак полная замена ресурса: клиент шлёт объект целиком, сервер отвечает сохранённым состоянием;POSTсоздания, когда идентификатор и метки времени приходят от клиента, а не генерируются базой.
Дальше перечислите, что обычно мешает совпадению: сервер дописывает id, дату создания, версию, подставляет значения по умолчанию, нормализует данные (обрезает пробелы, приводит число к строке), меняет порядок ключей и форматирование. Отдельный случай: ответ 204 не содержит тела вообще.
Вывод для тестирования: сравнивать разобранный JSON, а не строки, и не на полное равенство, а по набору значимых полей, исключив генерируемые сервером. И помнить, что совпадение тел не доказывает сохранение данных, это проверяется отдельным чтением.
Где спотыкаются
Сравнивают сырые строки. Другой порядок ключей, отступы, перенос строки в конце дают красный тест при полностью одинаковых данных. Сравнение делается после разбора, а не до.
Верят ответу вместо хранилища. Ручка может вернуть эхо присланного и не записать ничего: тест зелёный, данные потеряны. Нужна проверка повторным запросом или обращением к базе.
Не учитывают транспорт. Сжатие, передача по частям и кодировка меняют байты, не меняя смысла, поэтому проверки на длину тела и на точное совпадение начинают ломаться от настроек прокси, а не от дефекта в продукте.