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

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

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

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

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

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

Пример тестирования HTTP-метода DELETE

Тестирование операции DELETE — критически важная часть проверки RESTful API, так как она связана с удалением данных и может привести к необратимым изменениям. Основная цель — убедиться, что ресурс корректно удаляется, а система ведёт себя предсказуемо при различных сценариях, включая ошибочные.

Основные аспекты тестирования DELETE

При тестировании я фокусируюсь на нескольких ключевых областях:

  • Функциональность: Корректное удаление ресурса и связанных данных.
  • Идемпотентность: Повторный идентичный запрос должен возвращать тот же результат (обычно 404 Not Found или 410 Gone).
  • Безопасность: Проверка прав доступа (аутентификация, авторизация).
  • Состояние системы: Влияние на связанные сущности и консистентность данных.
  • Обработка ошибок: Поведение при невалидных запросах.

Пример тест-кейса для удаления пользователя

Предположим, у нас есть эндпоинт DELETE /api/users/{id}.

Позитивные сценарии

  1. Удаление существующего пользователя
    *   **Предусловие:** Пользователь с `id=123` существует в системе.
    *   **Шаги:**
        1.  Отправить `DELETE` запрос с валидным токеном авторизации.
    ```http
    DELETE /api/users/123 HTTP/1.1
    Authorization: Bearer <valid_token>
    ```
        2.  Проверить ответ.
    *   **Ожидаемый результат:**
        *   **Код ответа:** `204 No Content` (или `200 OK` с телом).
        *   **Повторный запрос:** `404 Not Found`.
        *   **Состояние БД:** Запись с `id=123` удалена. Связанные данные (например, профиль) обработаны согласно политике (удалены каскадно или оставлены с `user_id=NULL`).

  1. Проверка идемпотентности
    *   **Шаги:** Отправить два идентичных `DELETE` запроса подряд на один и тот же (уже удалённый после первого запроса) ресурс.
    *   **Ожидаемый результат:** Оба запроса возвращают `404 Not Found`. Система остаётся стабильной, не возникает ошибок `500`.

Негативные сценарии и обработка ошибок

  1. Удаление несуществующего ресурса
    DELETE /api/users/999999 HTTP/1.1
    Authorization: Bearer <valid_token>
    
    *   **Ожидаемый результат:** `404 Not Found`. Тело ошибки должно ясно указывать на причину.

  1. Отсутствие или невалидная авторизация
    DELETE /api/users/123 HTTP/1.1
    
    *   **Ожидаемый результат:** `401 Unauthorized` или `403 Forbidden`.

  1. Попытка удаления без необходимых прав (другой пользователь)
    *   **Предусловие:** Токен выдан для пользователя с `id=456`.
```http
DELETE /api/users/123 HTTP/1.1
Authorization: Bearer <token_for_user_456>
```
    *   **Ожидаемый результат:** `403 Forbidden`. Пользователь `123` не должен быть удалён.

  1. Невалидный идентификатор
    DELETE /api/users/abc!@ HTTP/1.1
    Authorization: Bearer <valid_token>
    
    *   **Ожидаемый результат:** `400 Bad Request` с сообщением о невалидном формате `id`.

Пример автоматизированного теста на Python (pytest + requests)

import pytest
import requests

BASE_URL = "https://api.example.com"
USER_ID = 123  # ID создаваемого тестового пользователя

class TestDeleteUser:

    @pytest.fixture
    def auth_headers(self, get_auth_token):
        """Фикстура возвращает заголовки с токеном."""
        return {"Authorization": f"Bearer {get_auth_token}"}

    @pytest.fixture
    def created_user(self, auth_headers):
        """Фикстура создаёт пользователя для тестов и возвращает его ID."""
        resp = requests.post(
            f"{BASE_URL}/api/users",
            json={"name": "Test User"},
            headers=auth_headers
        )
        user_data = resp.json()
        yield user_data["id"]  # Тест выполняется здесь
        # Пост-очистка на случай, если пользователь не был удалён
        requests.delete(
            f"{BASE_URL}/api/users/{user_data['id']}",
            headers=auth_headers
        )

    def test_delete_user_success(self, auth_headers, created_user):
        """Позитивный тест: успешное удаление."""
        delete_resp = requests.delete(
            f"{BASE_URL}/api/users/{created_user}",
            headers=auth_headers
        )
        # Проверяем код ответа
        assert delete_resp.status_code == 204
        # Проверяем, что ресурс действительно удалён
        get_resp = requests.get(
            f"{BASE_URL}/api/users/{created_user}",
            headers=auth_headers
        )
        assert get_resp.status_code == 404

    def test_delete_user_idempotency(self, auth_headers, created_user):
        """Проверка идемпотентности DELETE."""
        # Первый запрос
        resp1 = requests.delete(
            f"{BASE_URL}/api/users/{created_user}",
            headers=auth_headers
        )
        assert resp1.status_code in (200, 204)
        # Второй идентичный запрос
        resp2 = requests.delete(
            f"{BASE_URL}/api/users/{created_user}",
            headers=auth_headers
        )
        # Ожидаем 404 на повторный запрос к удалённому ресурсу
        assert resp2.status_code == 404

    @pytest.mark.parametrize("invalid_id, expected_code", [
        (999999, 404),   # Несуществующий
        ("invalid", 400), # Невалидный формат
        (None, 405),     # Отсутствие ID (может вести на /api/users/)
    ])
    def test_delete_user_negative(self, auth_headers, invalid_id, expected_code):
        """Параметризованный тест на негативные сценарии."""
        resp = requests.delete(
            f"{BASE_URL}/api/users/{invalid_id}",
            headers=auth_headers
        )
        assert resp.status_code == expected_code

Ключевые проверки помимо HTTP-ответа

При тестировании DELETE также важно:

  • Проверить каскадные операции в БД. Удаляются ли связанные записи? Активны ли foreign key constraints?
  • Проверить логирование. Фиксируется ли факт удаления для аудита?
  • Проверить кеши. Удаляется ли информация о ресурсе из кеша (например, Redis)?
  • Оценить влияние на бизнес-логику. Можно ли удалить администратора? Что происходит с активными заказами пользователя?

Таким образом, комплексное тестирование DELETE выходит за рамки простой проверки кода ответа 204 и требует анализа согласованности данных, безопасности и надёжности системы в целом.

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