Комментарии (1)
🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Пример тестирования HTTP-метода DELETE
Тестирование операции DELETE — критически важная часть проверки RESTful API, так как она связана с удалением данных и может привести к необратимым изменениям. Основная цель — убедиться, что ресурс корректно удаляется, а система ведёт себя предсказуемо при различных сценариях, включая ошибочные.
Основные аспекты тестирования DELETE
При тестировании я фокусируюсь на нескольких ключевых областях:
- Функциональность: Корректное удаление ресурса и связанных данных.
- Идемпотентность: Повторный идентичный запрос должен возвращать тот же результат (обычно
404 Not Foundили410 Gone). - Безопасность: Проверка прав доступа (аутентификация, авторизация).
- Состояние системы: Влияние на связанные сущности и консистентность данных.
- Обработка ошибок: Поведение при невалидных запросах.
Пример тест-кейса для удаления пользователя
Предположим, у нас есть эндпоинт DELETE /api/users/{id}.
Позитивные сценарии
- Удаление существующего пользователя
* **Предусловие:** Пользователь с `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`).
- Проверка идемпотентности
* **Шаги:** Отправить два идентичных `DELETE` запроса подряд на один и тот же (уже удалённый после первого запроса) ресурс.
* **Ожидаемый результат:** Оба запроса возвращают `404 Not Found`. Система остаётся стабильной, не возникает ошибок `500`.
Негативные сценарии и обработка ошибок
- Удаление несуществующего ресурса
DELETE /api/users/999999 HTTP/1.1 Authorization: Bearer <valid_token>
* **Ожидаемый результат:** `404 Not Found`. Тело ошибки должно ясно указывать на причину.
- Отсутствие или невалидная авторизация
DELETE /api/users/123 HTTP/1.1
* **Ожидаемый результат:** `401 Unauthorized` или `403 Forbidden`.
- Попытка удаления без необходимых прав (другой пользователь)
* **Предусловие:** Токен выдан для пользователя с `id=456`.
```http
DELETE /api/users/123 HTTP/1.1
Authorization: Bearer <token_for_user_456>
```
* **Ожидаемый результат:** `403 Forbidden`. Пользователь `123` не должен быть удалён.
- Невалидный идентификатор
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 и требует анализа согласованности данных, безопасности и надёжности системы в целом.