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

Приведи пример тестирования PUT

1.0 Junior🔥 183 комментариев
#Тестирование API

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

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

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

Пример тестирования метода PUT в REST API

Метод PUT в HTTP используется для полного обновления ресурса. В отличие от PATCH, который частично изменяет данные, PUT предполагает замену всего содержимого объекта на новые данные, предоставленные клиентом. Тестирование этого метода требует проверки не только успешных сценариев, но и обработки ошибок, граничных условий и соблюдения спецификации REST.

Ключевые принципы тестирования PUT

  1. Idempotency (Идемпотентность) – повторные одинаковые запросы PUT должны приводить к одинаковому состоянию ресурса.
  2. Complete Replacement (Полная заменa) – ресурс должен быть полностью заменен предоставленными данными; отсутствующие поля могут быть установлены в null или удалены.
  3. Resource Identification (Идентификация ресурса) – URI должен точно указывать на обновляемый ресурс.

Пример API и тестовых сценариев

Рассмотрим API для управления пользователями: PUT /api/users/{id}.

Успешное обновление ресурса (Happy Path):

PUT /api/users/123
Content-Type: application/json
Authorization: Bearer <token>

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

Ожидаемый ответ:

{
  "id": 123,
  "name": "Иван Петров",
  "email": "ivan.petrov@example.com",
  "age": 30,
  "active": true,
  "updatedAt": "2023-11-15T10:30:00Z"
}

Тесты для этого сценария:

  • Проверить статус ответа 200 OK или 204 No Content.
  • Убедиться, что тело ответа соответствует отправленным данным.
  • Проверить, что ресурс был действительно изменен (например, выполнить дополнительный GET запрос).
  • Проверить идемпотентность: отправлить тот же запрос дважды и убедиться, что результат идентичен и состояние ресурса не изменилось после второго запроса.

Тестирование граничных условий и обработки ошибок:

  1. Несуществующий ресурс:
    PUT /api/users/99999
    
    *   Ожидаемый результат: `404 Not Found`.
  1. Невалидные данные:
    PUT /api/users/123
    {"email": "invalid-email"}
    
    *   Ожидаемый результат: `400 Bad Request` с детализацией ошибки в теле ответа.
  1. Отсутствие обязательных полей (если API требует полной замены, это может быть ошибкой):
    PUT /api/users/123
    {"name": "Иван"}
    
    *   Ожидаемый результат: либо `400`, либо ресурс обновляется, но поля `email`, `age` становятся `null` (зависит от бизнес-логики).
  1. Конфликт данных (например, email уже используется другим пользователем):
    PUT /api/users/123
    {"email": "existing@example.com"}
    
    *   Ожидаемый результат: `409 Conflict`.
  1. Проблемы авторизации/аутентификации:
    PUT /api/users/123
    # без заголовка Authorization или с невалидным токеном
    
    *   Ожидаемый результат: `401 Unauthorized` или `403 Forbidden` (если пользователь пытается изменить данные другого пользователя).

Пример теста в Python (с использованием pytest и requests)

import pytest
import requests

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

def test_put_user_full_update():
    """Тест успешного полного обновления пользователя."""
    user_id = 123
    url = f"{BASE_URL}/users/{user_id}"
    headers = {"Authorization": "Bearer valid_token", "Content-Type": "application/json"}
    payload = {
        "name": "Иван Петров",
        "email": "ivan.petrov@example.com",
        "age": 30,
        "active": true
    }

    # Первый PUT запрос
    response = requests.put(url, json=payload, headers=headers)
    assert response.status_code == 200
    response_data = response.json()
    assert response_data["name"] == payload["name"]
    assert response_data["email"] == payload["email"]

    # Проверка идемпотентности: второй идентичный запрос
    response2 = requests.put(url, json=payload, headers=headers)
    assert response2.status_code == 200
    assert response2.json() == response_data  # Данные должны быть идентичными

    # Дополнительная проверка через GET
    get_response = requests.get(url, headers=headers)
    assert get_response.json() == response_data

def test_put_user_not_found():
    """Тест обновления несуществующего пользователя."""
    url = f"{BASE_URL}/users/99999"
    headers = {"Authorization": "Bearer valid_token"}
    payload = {"name": "Несуществующий"}
    response = requests.put(url, json=payload, headers=headers)
    assert response.status_code == 404

Дополнительные аспекты для тестирования

  • Валидация заголовков: Проверка обязательных заголовков, таких как Content-Type.
  • Производительность: Измерение времени ответа при обновлении больших ресурсов.
  • Безопасность: Попытка обновления с недостаточными правами, инъекции в данных.
  • Совместное состояние: Проверка, как обновление одного ресурса влияет на связанные ресурсы (например, если обновляется пользователь, его записи в блоге должны сохранять ссылку на новое имя).

Тестирование PUT метода — это комплексный процесс, направленный на гарантирование надежности, безопасности и соответствия API принципам REST. Особое внимание следует уделять идемпотентности и концепции полной замены, которые являются краеугольными камнями для этого HTTP метода.

Приведи пример тестирования PUT | PrepBro