Что такое тестирование API и какие его основные виды?

«Что такое тестирование API и какие его основные виды?» — вопрос из категории API тестирование, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Тестирование 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 (для нагрузочного тестирования).