Какие ключевые аспекты (параметры) необходимо тестировать в backend-приложении?

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

Ответ

Тестирование 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'