Ответ
Тестирование backend фокусируется на логике, данных, API, интеграциях и инфраструктуре.
1. Функциональное тестирование API
- Корректность эндпоинтов: HTTP-методы (GET, POST, PUT, DELETE, PATCH), URL, маршрутизация.
- Коды состояний HTTP: Проверка возвращаемых статусов (200 OK, 201 Created, 400 Bad Request, 401 Unauthorized, 404 Not Found, 500 Internal Server Error).
- Валидация запросов и ответов: Структура JSON/XML, типы данных, обязательные/опциональные поля, граничные значения.
- Бизнес-логика: Корректность обработки данных и выполнения операций.
2. Тестирование данных
- Работа с БД: Корректность CRUD-операций, целостность данных (foreign keys, constraints), выполнение транзакций, откаты при ошибках.
- Миграции БД: Применение и откат скриптов миграции.
3. Интеграционное тестирование
- Внешние сервисы: Мокирование и заглушки (stubs) для API платежных систем, email-сервисов, SMS-шлюзов.
- Очереди сообщений (Message Queues): Проверка отправки и получения сообщений (RabbitMQ, Kafka).
4. Нефункциональное тестирование
- Производительность и нагрузка: Время отклика (response time), пропускная способность (throughput) под нагрузкой, определение узких мест.
- Безопасность: Проверка на уязвимости (SQL-инъекции, XSS, недостаточная аутентификация/авторизация), валидация токенов (JWT).
- Логирование и мониторинг: Запись ошибок в логи, корректность работы health-check эндпоинтов.
Пример теста API на Python (pytest + requests):
import requests
import pytest
BASE_URL = "https://api.example.com"
def test_get_user_success():
"""Тест успешного получения пользователя."""
response = requests.get(f"{BASE_URL}/users/1")
assert response.status_code == 200
data = response.json()
assert "id" in data
assert "name" in data
assert data["id"] == 1
def test_create_user_validation_error():
"""Тест валидации: создание пользователя без обязательного поля."""
payload = {"email": "test@mail.com"} # Нет поля 'name'
response = requests.post(f"{BASE_URL}/users", json=payload)
assert response.status_code == 400 # Ожидаем ошибку валидации
error_data = response.json()
assert "error" in error_data
assert "name" in error_data["message"] # Проверяем, что ошибка связана с полем 'name'