Ответ
Полноценное тестирование эндпоинта включает проверку не только "счастливого пути", но и граничных условий, ошибок и нефункциональных требований.
Обязательный чек-лист:
-
Валидные запросы (Positive Testing):
- Статус-код: Ожидаемый 2xx (200 OK, 201 Created).
- Структура ответа: Соответствие JSON-схеме (используйте
jsonschemaдля валидации). - Данные: Корректность возвращаемых значений.
- Заголовки: Наличие важных заголовков (например,
Locationдля 201).
-
Невалидные запросы (Negative Testing):
- Ошибки клиента (4xx): 400 (неверный запрос), 401 (не авторизован), 403 (запрещено), 404 (не найдено), 422 (необрабатываемая сущность).
- Ошибки сервера (5xx): 500, 502, 503.
- Сообщения об ошибках: Они должны быть информативными, но не раскрывать внутреннюю структуру.
-
Безопасность и авторизация:
- Доступ без токена/с невалидным токеном должен возвращать 401.
- Проверка прав (Authorization): Пользователь с ролью
userне должен иметь доступа к эндпоинтамadmin(должен получать 403).
-
Валидация входных данных:
- Типы данных: Отправка строки вместо числа в поле
age. - Обязательные поля: Пропуск обязательного поля
email. - Граничные значения и ограничения: Отправка отрицательного значения для
limit, строки длиннее 255 символов.
- Типы данных: Отправка строки вместо числа в поле
-
Параметры запроса (для GET):
- Работа
query parameters:?limit=10&offset=20,?sort=name&order=desc. - Обработка неверных или неожиданных параметров.
- Работа
Пример комплексного теста на Python:
import requests
import pytest
import jsonschema
from schemas import USER_SCHEMA # Предопределенная JSON-схема
def test_get_user_happy_path():
"""Позитивный тест: получение существующего пользователя."""
response = requests.get("https://api.example.com/users/1",
headers={"Authorization": "Bearer valid_token"})
assert response.status_code == 200
data = response.json()
# Валидация по схеме
jsonschema.validate(instance=data, schema=USER_SCHEMA)
# Проверка данных
assert data["id"] == 1
assert "email" in data
def test_get_user_unauthorized():
"""Негативный тест: запрос без авторизации."""
response = requests.get("https://api.example.com/users/1")
assert response.status_code == 401
assert "error" in response.json() Ответ 18+ 🔞
Да ты посмотри, что творят, блядь! Приходят ко мне и говорят: «А мы протестировали». А я гляжу — один «счастливый путь», и всё, пиздец. Ну, типа, запрос отправили, ответ 200 пришёл, ну и ладно. Да ты что, сука, ёбта, так не бывает! Это как проверить, работает ли дверь, только толкнув её от себя. А если её на себя потянуть? А если с ноги ебануть? А если она, блядь, заперта? Вот и с API та же хуйня!
Слушай сюда, распиздяй недоделанный, вот тебе священный список, что надо делать, чтобы не выглядеть конченым идиотом.
Список дел, без которых ты — мудя:
-
Когда всё хорошо (ну, вроде как):
- Циферки в ответе: Должны быть 200, 201, вся эта радость. Не 404, блядь, и не 500.
- Ответ как с картинки: То, что пришло, должно быть похоже на то, что ты ждал. Используй
jsonschema, чтобы не гадать на кофейной гуще, ебать мои старые костыли. - Циферки внутри: Айдишник тот ли вернулся? Почта на месте? Всё проверить, блядь!
- Шапки (headers): Если создал что-то, должен быть заголовок
Location, где это лежит. А то создашь, а найти не сможешь — пидарас шерстяной.
-
Когда всё пошло по пизде (и это надо проверить):
- Ошибки твои, долбоёб (4xx): 400 — хуйню отправил, 401 — не пустили, 403 — совсем не пустили, 404 — нет такого, 422 — отправил такое, что сервер аж охренел.
- Ошибки сервера (5xx): 500, 502, 503 — тут уже не ты мудак, а они. Но проверить, что они правильно выглядят, надо.
- Сообщения: В ошибке должно быть написано что не так, но не должно светить, на каком сервере и в какой папке лежит код, ебаный вротберунчик.
-
Кто ты такой, чтобы сюда лезть?
- Без пропуска: Отправил запрос без токена или с левым токеном — получи 401 в ебало. И точка.
- Не по чину: Если ты юзер
user, а лезешь в/admin/launch_missiles— должен получить 403 и пойти нахуй. А не 200 и «ракеты запущены», блядь!
-
А давай-ка нахуярим всякой дичи в запрос!
- Типы: В поле
ageотправим строку"старый как говно мамонта". Сервер должен сказать «не, так не пойдёт». - Обязаловка: Просто не шлём поле
email. Что, принял? Пиздец, баг! - Ограничения:
limitставим-100500, или имя пользователя длиной в овердохуища символов. Сервер должен это отфильтровать.
- Типы: В поле
-
Для тех, кто просто смотрит (GET-запросы):
- Параметры: Проверяем, что
?limit=10&offset=20работает. - Хуйня вместо параметров: А что если отправить
?sort=ebalo&order=asc? Не должен сервер сгореть, должен адекватно ответить.
- Параметры: Проверяем, что
Вот, смотри, как на Python'е это выглядит, не будь говна кусок:
import requests
import pytest
import jsonschema
from schemas import USER_SCHEMA # Эта штука, где написано, как должен выглядеть ответ
def test_get_user_happy_path():
"""Ну вот, всё хорошо, пользователь есть."""
response = requests.get("https://api.example.com/users/1",
headers={"Authorization": "Bearer valid_token"})
assert response.status_code == 200 # Ёпта, главное не забыть!
data = response.json()
# Вот тут магия: проверяем, что ответ — не какая-то левая хуйня, а то, что мы ждём
jsonschema.validate(instance=data, schema=USER_SCHEMA)
# И заодно глянем, что внутри
assert data["id"] == 1
assert "email" in data # А то вдруг почту забыли вернуть, пидарасы
def test_get_user_unauthorized():
"""А вот попробуй без пропуска зайти. Получишь по ебалу."""
response = requests.get("https://api.example.com/users/1")
assert response.status_code == 401 # Должен сказать "Пошёл нахуй, незнакомец"
assert "error" in response.json() # И хотя бы написать, почему
Вот так, блядь. А не «ой, да вроде работает». Чувствуешь разницу? Чувствуешь, да?