Какой у вас уровень знания REST API?

Ответ

Я глубоко разбираюсь в REST API, понимаю его архитектурные ограничения и активно применяю эти знания в тестировании.

Понимание принципов REST:

  • Единообразие интерфейса: Использование стандартных HTTP-методов (GET, POST, PUT, PATCH, DELETE) и ресурсо-ориентированных URI.
  • Stateless (Без состояния): Каждый запрос содержит всю необходимую информацию для его обработки.
  • Кэшируемость: Понимание заголовков кэширования (Cache-Control, ETag).
  • Слоистая система: Клиент не обязан знать, общается ли он напрямую с сервером или через промежуточные узлы.

Навыки тестирования REST API:

  • Валидация ответов: Проверка HTTP-статус кодов (200, 201, 400, 401, 404, 500), структуры и данных в JSON/XML, соответствия JSON Schema.
  • Тестирование параметров: Проверка query-, path- и header-параметров, их валидации и обработки ошибок.
  • Тестирование безопасности: Проверка аутентификации (JWT, OAuth, Basic Auth), авторизации и защиты от распространенных уязвимостей.
  • Негативное тестирование: Отправка невалидных данных, проверка корректности и информативности сообщений об ошибках.

Пример теста на Python с использованием библиотеки requests:

import requests
import pytest

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

def test_create_and_retrieve_user():
    # 1. Создание нового пользователя (POST)
    new_user = {"name": "John Doe", "email": "john@example.com"}
    create_response = requests.post(f"{BASE_URL}/users", json=new_user)

    assert create_response.status_code == 201
    created_user = create_response.json()
    user_id = created_user["id"]
    assert created_user["name"] == new_user["name"]

    # 2. Получение созданного пользователя (GET)
    get_response = requests.get(f"{BASE_URL}/users/{user_id}")

    assert get_response.status_code == 200
    retrieved_user = get_response.json()
    assert retrieved_user["id"] == user_id
    assert retrieved_user["email"] == new_user["email"]

Инструменты: Активно использую Postman (включая коллекции и окружения), Swagger/OpenAPI для документации, curl для быстрых проверок. Понимаю ключевые отличия REST от SOAP (тяжеловесный XML, WSDL) и GraphQL (единая endpoint, клиент определяет запрашиваемые поля).

Ответ 18+ 🔞

Да ты посмотри на него, специалист по REST API подъехал! Ну-ка, разложу я тебе по полочкам, как я с этим добром работаю, а то ты думаешь, тут только теорию в зубах пережёвывать.

Про принципы, которые у меня в подкорке сидят:

  • Интерфейс, чтоб его: Я ж не мудак, чтобы DELETE-ом данные создавать. GET — для получения, POST — для создания, PUT/PATCH — для обновления, DELETE — для удаления. И URL должен на ресурс похож, а не на шифровку из кроссворда. /users/123, а не /getUserDataById?uid=123&action=fetch.
  • Stateless, ёпта: Каждый запрос — это отдельная песня. Серверу похуй, кто ты и что делал до этого. Всё, что надо, — в заголовках и теле запроса тащи. Никаких сессий на сервере, мать их.
  • Кэширование — наше всё: Заголовки Cache-Control — это не просто текст, это святое. Правильно настроил — нагрузку на сервер в разы срезал. Не настроил — получи ебучую лапшу из таймаутов под соусом из пятисотых ошибок.
  • Слои, блядь: Клиенту вообще по барабану, с кем он там на самом деле общается. С основным сервером, с проксёй, с балансировщиком — его дело — запрос отправить и ответ получить. Архитектурная красота, ядрёна вошь!

А теперь как я это всё ебучу тестами:

  • Что в ответе пришло? Первым делом смотрю на статус-код. Ожидал 201 Created, а получил 200 OK? Подозрение ебать чувствую. Ожидал 404, а получил 500? Вот это уже пиздец, а не ошибка. Потом сам JSON разбираю: все поля на месте? Типы данных те, что надо? Соответствует JSON Schema, которую нам эти задроты-разработчики дали?
  • Параметры — головная боль: Query-параметры, path-параметры, заголовки... Отправил отрицательный limit, строку вместо числа, или забыл обязательный заголовок Authorization — API должно не сдохнуть, а красиво и понятно послать меня нахуй с ошибкой 400.
  • Безопасность, ага, щас: JWT-токен протух? Доступ должен кончиться. У юзера роль user, а он лезет в админку DELETE /users/all? 403 Forbidden, иди отсюда. Проверяю, чтобы пароли по HTTP не летали, а токены не светились в логах.
  • Негативщина — моя любовь: Что будет, если в поле email отправить "абракадабра"? А если в age строку "старый как хуй"? А если отправить JSON-объект весом в гигабайт? Система должна отвечать адекватно, а не падать с воплями, как сука подорванная.

Вот тебе живой пример, как я на Python'е это обычно делаю:

import requests
import pytest

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

def test_create_and_retrieve_user():
    # 1. Создаём юзера (POST) — типа "давай, роди, сука"
    new_user = {"name": "John Doe", "email": "john@example.com"}
    create_response = requests.post(f"{BASE_URL}/users", json=new_user)

    # Ждём 201 Created, а не просто "ок"
    assert create_response.status_code == 201
    created_user = create_response.json()
    user_id = created_user["id"]
    assert created_user["name"] == new_user["name"]

    # 2. А теперь получим его же (GET) — "верни, что родил"
    get_response = requests.get(f"{BASE_URL}/users/{user_id}")

    # Тут уже 200 OK должен быть
    assert get_response.status_code == 200
    retrieved_user = get_response.json()
    # Проверяем, что это тот же самый урод
    assert retrieved_user["id"] == user_id
    assert retrieved_user["email"] == new_user["email"]

Инструменты? Да хуй с ними, с инструментами! Postman — для сложных сценариев и коллекций. Swagger — чтобы понять, что там эти разработчики вообще нагородили, иногда смотрю и волнение ебать — такой контракт, что тестировать нечего. cURL в консоли — для быстрой проверки, типа "а жива ли ручка?". А SOAP с его XML'ями — это просто ад нахуй. GraphQL — интересная штука, но там свой геморрой, когда клиент сам запрос собирает, можно такого наковырять...