Как отправлять файлы через HTTP
Что проверяют
Понимаете ли вы, как файл упакован в HTTP-запрос, и можете ли протестировать загрузку не только на счастливом пути. Следом обычно просят составить набор проверок для формы загрузки аватара.
Как отвечать
Способы передачи:
multipart/form-data: основной вариант для форм. Тело делится на части границейboundary, у каждой части свойContent-Disposition: form-data; name="file"; filename="photo.png"и свойContent-Type. Рядом с файлом можно передать обычные поля;- бинарное тело:
PUTилиPOSTс файлом целиком иContent-Type: application/octet-streamили реальным типом. Так часто грузят в объектное хранилище по presigned URL, минуя бэкенд; - base64 в JSON: работает, но раздувает размер примерно на треть и держит файл целиком в памяти;
- по частям: для больших файлов возобновляемая загрузка, протокол tus или multipart upload в S3-совместимых хранилищах.
В инструментах тестировщика: в Postman тело form-data и поле типа File, curl -F "file=@photo.png", в Python requests.post(url, files={"file": f}), в REST Assured .multiPart(new File(...)), в Playwright request.post(url, { multipart: {...} }) для API и setInputFiles для UI.
Коды, которые стоит проверять: 201 или 200 при успехе, 413 Content Too Large при превышении лимита, 415 Unsupported Media Type при недопустимом формате, 400 или 422 при ошибке валидации.
Набор проверок: граница лимита размера (ровно лимит и на байт больше), пустой файл, расширение не совпадает с содержимым, кириллица и пробелы в имени, очень длинное имя, ../../ в имени файла, SVG со скриптом, тестовый файл EICAR для антивируса, прерванная и повторная загрузка. Проверьте и то, что скачанный обратно файл совпадает по контрольной сумме.
Где спотыкаются
Выставляют Content-Type: multipart/form-data вручную. Без параметра boundary сервер не разберёт тело, а requests и fetch с FormData проставляют заголовок сами.
Проверяют только код 200. Сервер может вернуть успех, а файл сохранить обрезанным или под чужим именем.
Верят расширению и Content-Type от клиента. Их подделать проще всего, сервер должен смотреть на сигнатуру файла, и это стоит проверить отдельно.