Ответ
Тестирование API — это тип тестирования программного обеспечения, который фокусируется на проверке программных интерфейсов приложений (Application Programming Interfaces) на корректность, надёжность, производительность и безопасность.
Основные виды тестирования API:
| Вид тестирования | Цель | Пример проверки |
|---|---|---|
| Функциональное | Проверить, что API работает согласно спецификации. | Эндпоинт POST /users создаёт пользователя и возвращает 201 Created. |
| Валидация данных | Проверить структуру и содержание запросов/ответов. | Ответ содержит все обязательные поля в правильном формате (JSON Schema). |
| Интеграционное | Проверить взаимодействие API с другими сервисами (БД, кэш, сторонние API). | После POST /orders запись появляется в базе данных и отправляется уведомление. |
| Нагрузочное (Load) | Оценить производительность под ожидаемой нагрузкой. | Эндпоинт GET /products обрабатывает 100 RPS с latency < 200 мс. |
| Тестирование безопасности | Выявить уязвимости. | Проверка авторизации (токены, API-ключи), инъекций, чувствительных данных в логах. |
| Тестирование на отказоустойчивость | Проверить поведение при сбоях зависимостей. | Как API ведёт себя при недоступности базы данных (graceful degradation). |
Пример комплексного теста на Python (с использованием requests и pytest):
import requests
import pytest
BASE_URL = "https://api.example.com"
# 1. Функциональный тест
def test_create_user():
payload = {"name": "John", "email": "john@example.com"}
response = requests.post(f"{BASE_URL}/users", json=payload)
assert response.status_code == 201
assert response.headers["Content-Type"] == "application/json"
user_data = response.json()
assert user_data["id"] is not None
assert user_data["name"] == payload["name"]
# Валидация по схеме (используя библиотеку jsonschema)
# 2. Тест валидации (негативный сценарий)
def test_create_user_invalid_email():
payload = {"name": "John", "email": "invalid-email"}
response = requests.post(f"{BASE_URL}/users", json=payload)
assert response.status_code == 400
error_data = response.json()
assert "email" in error_data.get("errors", {})
# 3. Тест безопасности (проверка авторизации)
def test_access_without_token():
response = requests.get(f"{BASE_URL}/admin/users")
assert response.status_code == 401 # Unauthorized
Инструменты: Postman, Insomnia (для ручного тестирования и создания коллекций), requests + pytest/unittest (для автоматизации), JMeter/Gatling (для нагрузочного тестирования).
Ответ 18+ 🔞
Да ты посмотри, что за хуйня творится в этом мире! Сидишь ты такой, пишешь свой сервис, а он, сука, общается с другими не через красивые кнопочки, а через эти... API, блядь! И вот тут-то и начинается самое интересное — тестирование этой паутины.
Тестирование API — это, грубо говоря, когда ты берёшь свою программную морду лица и начинаешь её щупать со всех сторон, чтобы понять, не развалится ли она, когда к ней придут гости. Проверяешь, работает ли она по паспорту, не пиздит ли, выдержит ли напор и не сливает ли все пароли в лог, как последняя мартышлюшка.
Основные виды, на которые её можно разложить:
| Вид тестирования | Суть вопроса | Пример, чтобы не быть мудаком |
|---|---|---|
| Функциональное | Работает ли эта штука так, как задумано, или она просто пиздит? | Тыкнул в POST /users — пользователь создался, и сервер тебе вежливо сказал 201 Created, а не послал нахуй. |
| Валидация данных | А не несёт ли он в ответе какую-то дичь вместо нормальных данных? | Ответ пришёл в JSON, все поля на месте, и email выглядит как email, а не как «ядра — чистый изумруд». |
| Интеграционное | А не обосрётся ли всё, когда твой API полезет в базу данных или в другой сервис? | Создал заказ — он и в базе появился, и уведомление улетело. Красота, блядь! |
| Нагрузочное | А не сдохнет ли он, если на него навалятся все пользователи разом? | Эндпоинт GET /products должен переварить 100 запросов в секунду и не задумываться дольше 200 мс, иначе пиши пропало. |
| Тестирование безопасности | А не найдёт ли какой-нибудь хитрожопый школьник дыру, чтобы всё у нас украсть? | Проверяешь, пускает ли он без токена куда не надо, не светит ли секреты в ошибках — в общем, не пизда ли он с ушами. |
| На отказоустойчивость | А что будет, если база данных накроется медным тазом? Он тоже сляжет или как-то выкрутится? | API должен не просто упасть с криком «всё пропало!», а как-то извернуться и сказать: «Сорян, ребят, ща починим». |
Вот, смотри, как это примерно в коде выглядит (Python, requests, pytest):
import requests
import pytest
BASE_URL = "https://api.example.com"
# 1. Проверяем, что создание пользователя вообще работает
def test_create_user():
payload = {"name": "John", "email": "john@example.com"}
response = requests.post(f"{BASE_URL}/users", json=payload)
assert response.status_code == 201
assert response.headers["Content-Type"] == "application/json"
user_data = response.json()
assert user_data["id"] is not None
assert user_data["name"] == payload["name"]
# Тут бы ещё схему проверить, но это уже детали
# 2. А теперь попробуем наебать систему
def test_create_user_invalid_email():
payload = {"name": "John", "email": "invalid-email"}
response = requests.post(f"{BASE_URL}/users", json=payload)
assert response.status_code == 400 # Должен сказать "иди нахуй с таким email"
error_data = response.json()
assert "email" in error_data.get("errors", {})
# 3. Проверим, не пускает ли он куда попало без пропуска
def test_access_without_token():
response = requests.get(f"{BASE_URL}/admin/users")
assert response.status_code == 401 # Должен ответить "А ты кто такой, сука?"
Чем это всё делают: Для ручных пыток — Postman или Insomnia. Для автоматизации, чтобы не делать это вручную каждый раз — requests с pytest или unittest. А если надо устроить адский прессинг и посмотреть, как всё летит к чертям — JMeter или Gatling. Вот такая, блядь, наука!