Какой подход вы используете для проверки метода API?

Ответ

Для всесторонней проверки метода API я применяю многоуровневую стратегию, основанную на анализе спецификации и практическом тестировании.

Основные этапы:

  1. Анализ контракта: Изучаю документацию (Swagger/OpenAPI) для понимания ожидаемых входных/выходных параметров, кодов состояния и схем данных.
  2. Разработка тест-кейсов: Создаю сценарии, покрывающие:
    • Позитивные сценарии с валидными данными.
    • Негативные сценарии: невалидные данные, отсутствующие обязательные поля, неверные типы.
    • Граничные значения и валидации: проверка ограничений (min/max length, диапазоны).
    • Безопасность и авторизация: доступ без токена, с неверными правами.
  3. Автоматизация и выполнение: Использую инструменты вроде Postman (для ручных проверок и коллекций) или пишу скрипты на Python с requests и pytest для интеграции в CI/CD.

Пример теста на Python с pytest:

import pytest
import requests

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

def test_get_user_positive():
    """Позитивный тест: получение данных существующего пользователя."""
    user_id = 1
    response = requests.get(f"{BASE_URL}/users/{user_id}")

    assert response.status_code == 200
    assert response.headers["Content-Type"] == "application/json"

    data = response.json()
    assert data["id"] == user_id
    assert "name" in data

def test_get_user_negative_not_found():
    """Негативный тест: запрос несуществующего пользователя."""
    response = requests.get(f"{BASE_URL}/users/99999")
    assert response.status_code == 404

def test_create_user_validation_error():
    """Тест валидации: попытка создания пользователя без обязательного поля."""
    payload = {"email": "test@example.com"}  # Нет поля 'name'
    response = requests.post(f"{BASE_URL}/users", json=payload)

    assert response.status_code == 400
    error_data = response.json()
    assert "validation_error" in error_data
    assert "name" in error_data["validation_error"]
  1. Проверка нефункциональных требований: При необходимости тестирую производительность (latency, throughput) и нагрузку.
  2. Верификация интеграции: Убеждаюсь, что метод корректно взаимодействует с другими сервисами и БД, проверяя побочные эффекты (например, создание записи в логе).

Ответ 18+ 🔞

А, ну ты про тестирование API заговорил! Ну это ж святое, блядь. Сидишь такой, как будто в цирке, только вместо клоунов — эндпоинты, которые тебе в ответ то JSON'ом плюются, то ошибкой в пятьсот строк, сука.

Слушай, а стратегия-то у меня, блядь, не хухры-мухры, а продуманная, как у шпиона. Первым делом — контракт читаю. Беру эту вашу спецификацию, Swagger там всякий, OpenAPI, и врубаюсь, как монах в древний свиток. Что на вход жрёт, что на выход срёт, какие коды статусов бывают — «двести» хорошо, «четыреста» плохо, «пятьсот» — всё, пиздец, сервер горит.

Дальше, блядь, тест-кейсы строю. Тут надо головой думать, а не жопой. Позитивные — это когда всё по маслу, данные как у хорошего мальчика. А вот негативные — это где начинается веселье, ёпта! Кидаю ему поля не те, типы кривые, обязательную хуйню пропускаю — смотрю, как API обосрётся или, наоборот, стойко держит удар. Граничные значения — это вообще отдельная песня: отправишь строку в один символ — ок, а в двести пятьдесят символов — хрен, лимит! И про безопасность не забываю: а что если без токена приползти? А если с токеном, но правами дворника? Должен послать нахуй, и точка.

Потом, сука, автоматизирую это безобразие. Ручками в Postman'е потыкать — это для разминки, для души. А настоящая мощь — это скрипты на Python, которые сами всё проверят и отчитаются, как роботы-убийцы. В CI/CD запихнуть — красота, при каждом коммите тесты сами побегут, как охуевшие.

Вот, глянь, как это примерно выглядит, только не пугайся, код трогать не буду, он святой:

import pytest
import requests

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

def test_get_user_positive():
    """Позитивный тест: получение данных существующего пользователя."""
    user_id = 1
    response = requests.get(f"{BASE_URL}/users/{user_id}")

    assert response.status_code == 200
    assert response.headers["Content-Type"] == "application/json"

    data = response.json()
    assert data["id"] == user_id
    assert "name" in data

def test_get_user_negative_not_found():
    """Негативный тест: запрос несуществующего пользователя."""
    response = requests.get(f"{BASE_URL}/users/99999")
    assert response.status_code == 404

def test_create_user_validation_error():
    """Тест валидации: попытка создания пользователя без обязательного поля."""
    payload = {"email": "test@example.com"}  # Нет поля 'name'
    response = requests.post(f"{BASE_URL}/users", json=payload)

    assert response.status_code == 400
    error_data = response.json()
    assert "validation_error" in error_data
    assert "name" in error_data["validation_error"]

А ещё, блядь, бывает, надо производительность померять — не тупит ли он, если десять тысяч запросов в него впендюрить? И интеграции проверить — может, он там не только ответ шлёт, но и в базу какую-нибудь хуйню записывает, или в другой сервис событие пинает? Надо убедиться, что эти побочные эффекты — именно те, что надо, а не «ой, а мы всю базу случайно почистили, ёпта!».

В общем, работа это такая — найти все слабые места, пока их не нашёл какой-нибудь хитрожопый пользователь. А то будет потом: «ой, а у нас данные всех пользователей в открытом доступе висят!». Пиздец и срамословие.