← Назад к вопросам

Что такое PUT?

1.2 Junior🔥 192 комментариев
#Теория тестирования

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое HTTP PUT?

PUT — это один из методов HTTP, используемый для создания или полного обновления ресурса на указанном URI. Его ключевая особенность — идемпотентность. Идемпотентный метод означает, что многократное выполнение одного и того же запроса с одинаковыми данными приводит к одному и тому же состоянию системы, как и одно выполнение. Это делает PUT предпочтительным для операций обновления, где требуется гарантия конечного результата.

Основные характеристики и назначение PUT

  • Создание или полное замещение: Если ресурс с указанным URI существует, PUT полностью заменяет его тело новыми данными из запроса. Если ресурс не существует, сервер может создать новый ресурс с этим URI (это зависит от реализации API).
  • Идемпотентность: Как уже упомянуто, это главное отличие от, например, POST. Два одинаковых PUT запроса к одному URI дадут тот же результат, что и один. Это критично для надежности операций в распределенных системах.
  • Требуется указание URI: Клиент должен точно знать полный URI ресурса, который он хочет создать или обновить. В отличие от POST, который часто отправляется на коллекцию (например, /users), PUT отправляется на конкретный элемент (например, /users/123).
  • Ответ сервера: Успешный PUT запрос обычно возвращает код состояния 200 (OK) или 204 (No Content). Если PUT использовался для создания нового ресурса, может возвращаться 201 (Created).

Сравнение с другими методами: POST и PATCH

Для понимания PUT важно отличать его от POST и PATCH.

  • POST: Используется для создания нового ресурса, часто без указания конкретного URI (сервер назначает ID). Он также может выполнять любые другие действия (например, запускать процесс). POST не является идемпотентным — два одинаковых POST запроса могут создать два одинаковых ресурса.
  • PATCH: Используется для частичного обновления ресурса. Клиент отправляет только те поля, которые нужно изменить. PUT же требует отправки полного представления ресурса, даже если меняется только одно поле.

Пример PUT запроса в тестировании (REST API)

Рассмотрим пример теста для обновления данных пользователя через PUT.

import requests
import pytest

BASE_URL = "https://api.example.com"

def test_put_update_user():
    # 1. Предполагаем, что пользователь с ID 101 уже существует
    user_id = 101
    url = f"{BASE_URL}/users/{user_id}"

    # 2. Данные для полного обновления ресурса
    updated_user_data = {
        "name": "Иван Петров",
        "email": "ivan.petrov@example.com",
        "age": 30
    }

    # 3. Выполнение PUT запроса
    response = requests.put(url, json=updated_user_data)

    # 4. Проверка ответа
    assert response.status_code == 200  # или 204

    # 5. Проверка, что данные действительно обновились (GET запрос)
    get_response = requests.get(url)
    assert get_response.status_code == 200
    actual_user = get_response.json()

    assert actual_user["name"] == updated_user_data["name"]
    assert actual_user["email"] == updated_user_data["email"]
    assert actual_user["age"] == updated_user_data["age"]

    # 6. Проверка идемпотентности (опционально, но важно для понимания)
    response_repeat = requests.put(url, json=updated_user_data)
    assert response_repeat.status_code == 200
    get_response_after_repeat = requests.get(url)
    user_after_repeat = get_response_after_repeat.json()
    # Состояние ресурса должно быть идентичным после первого и второго PUT
    assert user_after_repeat == actual_user
// Пример на JavaScript (Node.js с использованием axios)
const axios = require('axios');

async function testPutRequest() {
    const userId = 101;
    const url = `https://api.example.com/users/${userId}`;

    const payload = {
        name: "Иван Петров",
        email: "ivan.petrov@example.com",
        age: 30
    };

    try {
        // Выполнение PUT запроса
        const putResponse = await axios.put(url, payload);
        console.log(`Status: ${putResponse.status}`); // 200 или 204

        // Проверка через GET
        const getResponse = await axios.get(url);
        console.log('Updated user:', getResponse.data);

        // Сравнение данных
        const updatedUser = getResponse.data;
        if (updatedUser.name === payload.name &&
            updatedUser.email === payload.email &&
            updatedUser.age === payload.age) {
            console.log('PUT update verified successfully.');
        }
    } catch (error) {
        console.error('Error during PUT test:', error.message);
    }
}

Что проверяет QA Automation Engineer при работе с PUT?

  1. Корректность кода ответа: Запрос на существующий ресурс должен возвращать 200/204, на создание нового — возможно 201.
  2. Полное замещение данных: После PUT GET запрос должен возвращать ресурс, идентичный отправленному в теле PUT.
  3. Идемпотентность: Многократные идентичные PUT запросы не должны вызывать ошибок и должны приводить систему в одно и то же конечное состояние.
  4. Обработка ошибок: Проверка ответов на неверные данные (400), отсутствие ресурса (404), проблемы с авторизацией (401/403) и т.д.
  5. Валидация данных: Сервер должен правильно валидировать входящие данные (например, тип поля age — число) и возвращать соответствующие ошибки.
  6. Совместное использование с другими методами: Проверка, что после PUT можно успешно выполнить DELETE или PATCH на тот же ресурс.

Резюме

PUT — мощный идемпотентный метод HTTP для операций «полного обновления или создания». В контексте автоматизации тестирования REST API важно проверять не только его базовую функциональность, но и ключевое свойство — идемпотентность, которое обеспечивает надежность и предсказуемость взаимодействия клиента и сервера. Его следует выбирать над POST, когда клиент имеет полный контроль над URI и конечным состоянием ресурса, а также требуется гарантия отсутствия побочных эффектов от повторных запросов.