Как проверить, отправляет ли веб-сервис данные в базу данных?

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

Ответ

Веб-сервис (бэкенд) обычно выступает посредником между клиентом и БД. Проверить факт записи можно несколькими способами.

Стратегии проверки:

  1. Прямая проверка в БД:

    • Выполнить запрос к целевой таблице до и после вызова сервиса.
      -- До вызова
      SELECT COUNT(*) FROM users WHERE email = 'test@example.com';
      -- После успешного POST /users
      SELECT * FROM users WHERE email = 'test@example.com';
  2. Анализ логов:

    • Логи приложения: Искать записи об успешном выполнении SQL-операторов INSERT/UPDATE.
    • Логи базы данных: Включить general log или slow query log (для MySQL) для отслеживания всех входящих запросов.
  3. Инструменты мониторинга:

    • Использовать APM-системы (например, Datadog, New Relic), которые трассируют запросы от API до SQL.
    • Настроить алерты на увеличение количества операций записи (Writes/sec).
  4. Тестовый сценарий (на примере Python с requests и pytest):

    import requests
    import psycopg2  # для прямого подключения к БД для проверки
    
    def test_user_creation_writes_to_db():
        # 1. Исходное состояние
        initial_count = get_user_count_from_db()
    
        # 2. Вызов сервиса
        payload = {"name": "Alice", "email": "alice@example.com"}
        response = requests.post("https://api.example.com/users", json=payload)
        assert response.status_code == 201
    
        # 3. Проверка результата в БД
        final_count = get_user_count_from_db()
        assert final_count == initial_count + 1
    
        new_user = get_user_from_db("alice@example.com")
        assert new_user["name"] == "Alice"

Важно: Если сервис реализует CQRS или использует кэширование, запись в БД и чтение из неё могут быть разнесены во времени. Также существуют сервисы, предназначенные только для чтения (read-only), которые не производят запись.