Ответ
Имею комплексный опыт ручного и автоматизированного тестирования REST API.
Основные направления работы:
-
Функциональное тестирование:
- Проверка корректности CRUD операций (GET, POST, PUT, PATCH, DELETE).
- Валидация кодов состояния HTTP (200, 201, 400, 401, 403, 404, 409, 500).
- Проверка бизнес-логики и граничных условий.
-
Тестирование данных:
- Проверка структуры JSON ответа на соответствие контракту (использую JSON Schema или Pydantic).
- Валидация типов данных, обязательных полей, форматов (email, date, UUID).
-
Тестирование безопасности и авторизации:
- Проверка эндпоинтов на наличие аутентификации (JWT, OAuth2, Basic Auth).
- Тестирование ролевой модели доступа (RBAC).
- Проверка на чувствительные данные в ответах.
-
Тестирование производительности и надёжности:
- Проверка ограничения частоты запросов (rate limiting).
- Тестирование пагинации и сортировки.
- Проверка обработки некорректных данных и устойчивости к сбоям.
Инструменты и технологии:
- Для ручного тестирования/исследования: Postman, Swagger UI, cURL.
- Для автоматизации: Python (библиотеки requests, pytest, pydantic), интеграция с Allure для отчётности.
- Для валидации: JSON Schema, встроенные валидаторы Postman.
Пример автоматизированного теста на Python (pytest):
import requests
import pytest
BASE_URL = "https://api.example.com"
def test_create_and_retrieve_item():
# 1. Создание нового ресурса (POST)
payload = {"title": "Test Item", "count": 5}
create_response = requests.post(f"{BASE_URL}/items", json=payload)
assert create_response.status_code == 201
created_item = create_response.json()
item_id = created_item["id"]
# 2. Получение созданного ресурса (GET)
get_response = requests.get(f"{BASE_URL}/items/{item_id}")
assert get_response.status_code == 200
retrieved_item = get_response.json()
# 3. Проверка целостности данных
assert retrieved_item["id"] == item_id
assert retrieved_item["title"] == payload["title"]
assert retrieved_item["count"] == payload["count"] Ответ 18+ 🔞
Да ты посмотри, какой у меня опыт, ёпта! Не просто там кнопки понажимать, а целый комплекс, блядь, ручного и автоматического тестирования этих ваших REST API. Прямо как хирург, только для эндпоинтов.
Чем конкретно мозги выношу этим API:
-
Функционал, мать его:
- Проверяю, чтобы все эти CRUD операции (создать, прочитать, обновить, удалить) работали, а не просто так, для галочки.
- Смотрю, чтобы сервер не радовался, когда ему херню слать, а отвечал правильными кодами HTTP — 200, 400, 404, 500. Чтобы 500-ю ошибку не на пустой GET-запрос выдавал, а то бывает, пиздец.
- Ломаю голову над бизнес-логикой и всеми этими граничными условиями. Что будет, если передать отрицательное число или строку длиной в овердохуища символов?
-
С данными работаю:
- Сверяю, чтобы JSON в ответе был не абы какой, а точно по контракту. Использую для этого JSON Schema или Pydantic, чтобы не гадать на кофейной гуще.
- Валидирую всё: типы данных, обязательные поля, форматы (чтобы дата была датой, а не "позавчера").
-
Безопасность, блядь:
- Проверяю, защищены ли эндпоинты аутентификацией (JWT, OAuth и прочая муть). Чтобы без токена доступ был — ноль, как терпение мое в понедельник утром.
- Тестирую ролевую модель. Чтобы юзер не мог админские штуки делать, а гость — приватные данные смотреть.
- Ищу, не светит ли API в ответах чувствительной инфой типа паролей или номеров карт.
-
Надёжность и производительность:
- Проверяю rate limiting — чтобы ботовод не мог заDDOSить сервак.
- Смотрю, как работает пагинация и сортировка. Чтобы на запрос "дай всё" не прилетало десять тыщ записей разом.
- Люблю слать некорректные данные и смотреть, как система не падает, а красиво ругается. Устойчивость к сбоям — наше всё.
Чем воюю:
- Для разведки и ручного тыка: Postman, Swagger UI, старый добрый cURL.
- Для автоматизации, чтобы не делать одно и то же: Python с библиотеками requests, pytest и pydantic. Результаты потом в Allure вывожу — красота, а не отчёты.
- Для валидации: JSON Schema и встроенные валидаторы в том же Postman.
Вот, смотри, как это в коде выглядит, простой пример:
import requests
import pytest
BASE_URL = "https://api.example.com"
def test_create_and_retrieve_item():
# 1. Создаём новую хрень (POST)
payload = {"title": "Test Item", "count": 5}
create_response = requests.post(f"{BASE_URL}/items", json=payload)
assert create_response.status_code == 201 # Должен быть "Создано", а не "Ой, всё"
created_item = create_response.json()
item_id = created_item["id"]
# 2. Достаём только что созданную хрень (GET)
get_response = requests.get(f"{BASE_URL}/items/{item_id}")
assert get_response.status_code == 200 # Должен быть "ОК"
retrieved_item = get_response.json()
# 3. Сверяем, не подменили ли нам её по дороге
assert retrieved_item["id"] == item_id
assert retrieved_item["title"] == payload["title"]
assert retrieved_item["count"] == payload["count"]
Вот так-то, не просто "проверил", а с пониманием, куда и зачем тыкаю.