Какой у вас опыт тестирования REST API?

Ответ

Опыт включает ручное тестирование (Postman) и создание автотестов, преимущественно на стеке Python (pytest + requests). Основные направления работы:

1. Функциональное тестирование:

  • Проверка HTTP-статусов (200 OK, 201 Created, 400 Bad Request, 404 Not Found, 500 Internal Server Error).
  • Валидация структуры и данных ответа (использую библиотеку jsonschema).
  • Тестирование граничных значений и некорректных входных данных для параметров.

2. Нефункциональное тестирование:

  • Проверка заголовков (Content-Type, Cache-Control).
  • Базовая проверка производительности и анализ логов.
  • Тестирование авторизации (JWT, OAuth 2.0).

Пример автотеста для GET-запроса:

import requests
import jsonschema

def test_get_user_by_id():
    url = "https://api.example.com/v1/users/1"

    # 1. Выполнение запроса
    response = requests.get(url, headers={"Authorization": "Bearer token123"})

    # 2. Проверка статус-кода
    assert response.status_code == 200

    # 3. Проверка заголовка
    assert response.headers["Content-Type"] == "application/json"

    # 4. Валидация JSON-схемы ответа
    user_schema = {
        "type": "object",
        "properties": {
            "id": {"type": "integer"},
            "name": {"type": "string"},
            "email": {"type": "string", "format": "email"}
        },
        "required": ["id", "name", "email"]
    }
    jsonschema.validate(instance=response.json(), schema=user_schema)

Работал с документацией OpenAPI (Swagger) и инструментами для нагрузочного тестирования (например, Locust).

Ответ 18+ 🔞

А, ну вот, смотри, как оно бывает. Сидишь такой, пишешь себе тесты, а вокруг — джунгли из API, блядь. И главное, чтобы эта вся хуйня работала, а не падала, как подкошенная, при первом же чихе.

Опыт у меня, значит, такой: ручками в Postman'е полазил, знаешь, как обезьяна по лианам, а потом подумал — а нахуй каждый раз одно и то же кликать? И пошёл писать автотесты. В основном на Python, потому что он как родной, с pytest и requests — это связка, блядь, просто бомба.

1. Функциональщина, мать её:

  • Смотрю, чтобы сервер не посылал мне в ответ какую-нибудь дичь. 200 OK — красота, 201 Created — вообще заебись. А вот если 400 или 404 — ну, тут уже надо думать, кто из нас долбоёб: я запрос кривой послал или они там хуйню какую-то накодили. 500 — это уже пиздец, их проблемы, но моя работа — это найти.
  • Структуру ответа проверяю. Не просто "а, ну JSON пришёл, и ладно". А чтоб поля все на месте были и типы правильные. Для этого jsonschema — вещь, блядь, незаменимая, хоть и занудная иногда.
  • Обожаю, сука, граничные значения гонять. Типа, передай в параметр -1, или 999999, или пустую строку. Смотришь, как API обосрётся — это же чистое удовольствие, ёпта! Находишь такие дыры — чувствуешь себя хакером, блядь.

2. Нефункциональные приколы:

  • Заголовки — это святое. Content-Type должен быть application/json, а не text/html, а то потом парсишь эту хуйню и удивляешься, почему ничего не работает. Cache-Control тоже гляну — мало ли.
  • Производительность... Ну, не то чтобы я прям LoadRunner, но если запрос пять секунд висит — это повод задуматься и в логи посмотреть.
  • Авторизация — отдельная песня. Эти ваши JWT, OAuth... Иногда кажется, что проще пароль по мылу переслать, чем с этим всем разбираться. Но разбираешься, блядь.

Вот, смотри, как я обычно костыляю тест для GET-запроса:

import requests
import jsonschema

def test_get_user_by_id():
    url = "https://api.example.com/v1/users/1"

    # 1. Тыкаем палкой в API
    response = requests.get(url, headers={"Authorization": "Bearer token123"})

    # 2. Первое дело — статус-код. Не 200? Ну всё, пошёл нахуй.
    assert response.status_code == 200

    # 3. Глазками на заголовок: точно ли JSON нам прислали, а не картинку с котиком?
    assert response.headers["Content-Type"] == "application/json"

    # 4. А теперь самая нудятина — схема. Но без неё никуда, иначе приползёт какая-нибудь хрень в ответе.
    user_schema = {
        "type": "object",
        "properties": {
            "id": {"type": "integer"},
            "name": {"type": "string"},
            "email": {"type": "string", "format": "email"}
        },
        "required": ["id", "name", "email"]
    }
    jsonschema.validate(instance=response.json(), schema=user_schema)

Ещё, бывало, с OpenAPI (этот ваш Swagger) работал — читаешь спецификацию и думаешь: "Бля, они тут написали одно, а API делает вообще другое, пидарасы". Ну и для нагрузочного тестирования Locust'ом баловался — запускаешь рой виртуальных юзеров и смотришь, как сервер начинает потеть и просить пощады. Красота, в общем.