Что является обязательными пунктами для проверки при тестировании API эндпоинтов?

Ответ

Полноценное тестирование эндпоинта включает проверку не только "счастливого пути", но и граничных условий, ошибок и нефункциональных требований.

Обязательный чек-лист:

  1. Валидные запросы (Positive Testing):

    • Статус-код: Ожидаемый 2xx (200 OK, 201 Created).
    • Структура ответа: Соответствие JSON-схеме (используйте jsonschema для валидации).
    • Данные: Корректность возвращаемых значений.
    • Заголовки: Наличие важных заголовков (например, Location для 201).
  2. Невалидные запросы (Negative Testing):

    • Ошибки клиента (4xx): 400 (неверный запрос), 401 (не авторизован), 403 (запрещено), 404 (не найдено), 422 (необрабатываемая сущность).
    • Ошибки сервера (5xx): 500, 502, 503.
    • Сообщения об ошибках: Они должны быть информативными, но не раскрывать внутреннюю структуру.
  3. Безопасность и авторизация:

    • Доступ без токена/с невалидным токеном должен возвращать 401.
    • Проверка прав (Authorization): Пользователь с ролью user не должен иметь доступа к эндпоинтам admin (должен получать 403).
  4. Валидация входных данных:

    • Типы данных: Отправка строки вместо числа в поле age.
    • Обязательные поля: Пропуск обязательного поля email.
    • Граничные значения и ограничения: Отправка отрицательного значения для limit, строки длиннее 255 символов.
  5. Параметры запроса (для 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 та же хуйня!

Слушай сюда, распиздяй недоделанный, вот тебе священный список, что надо делать, чтобы не выглядеть конченым идиотом.

Список дел, без которых ты — мудя:

  1. Когда всё хорошо (ну, вроде как):

    • Циферки в ответе: Должны быть 200, 201, вся эта радость. Не 404, блядь, и не 500.
    • Ответ как с картинки: То, что пришло, должно быть похоже на то, что ты ждал. Используй jsonschema, чтобы не гадать на кофейной гуще, ебать мои старые костыли.
    • Циферки внутри: Айдишник тот ли вернулся? Почта на месте? Всё проверить, блядь!
    • Шапки (headers): Если создал что-то, должен быть заголовок Location, где это лежит. А то создашь, а найти не сможешь — пидарас шерстяной.
  2. Когда всё пошло по пизде (и это надо проверить):

    • Ошибки твои, долбоёб (4xx): 400 — хуйню отправил, 401 — не пустили, 403 — совсем не пустили, 404 — нет такого, 422 — отправил такое, что сервер аж охренел.
    • Ошибки сервера (5xx): 500, 502, 503 — тут уже не ты мудак, а они. Но проверить, что они правильно выглядят, надо.
    • Сообщения: В ошибке должно быть написано что не так, но не должно светить, на каком сервере и в какой папке лежит код, ебаный вротберунчик.
  3. Кто ты такой, чтобы сюда лезть?

    • Без пропуска: Отправил запрос без токена или с левым токеном — получи 401 в ебало. И точка.
    • Не по чину: Если ты юзер user, а лезешь в /admin/launch_missiles — должен получить 403 и пойти нахуй. А не 200 и «ракеты запущены», блядь!
  4. А давай-ка нахуярим всякой дичи в запрос!

    • Типы: В поле age отправим строку "старый как говно мамонта". Сервер должен сказать «не, так не пойдёт».
    • Обязаловка: Просто не шлём поле email. Что, принял? Пиздец, баг!
    • Ограничения: limit ставим -100500, или имя пользователя длиной в овердохуища символов. Сервер должен это отфильтровать.
  5. Для тех, кто просто смотрит (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()  # И хотя бы написать, почему

Вот так, блядь. А не «ой, да вроде работает». Чувствуешь разницу? Чувствуешь, да?