Чем отличаются интеграционные тесты от функциональных

Ответ

Основное различие — в цели и уровне абстракции. Хотя эти понятия часто пересекаются, у них разный фокус.

Чтобы понять разницу, полезно рассмотреть три основных уровня тестирования:

  1. Модульные тесты (Unit Tests)

    • Цель: Проверить наименьшую изолированную часть кода (функцию, метод, класс).
    • Фокус: Корректность логики одного компонента. Внешние зависимости (БД, API) обычно заменяются моками (заглушками).
    • Пример:

      # Функция, которую тестируем
      def add(a, b):
          return a + b
      
      # Модульный тест
      def test_add():
          assert add(2, 3) == 5
          assert add(-1, 1) == 0
  2. Интеграционные тесты (Integration Tests)

    • Цель: Проверить, как несколько компонентов системы работают вместе.
    • Фокус: Взаимодействие между модулями, сервисами, базой данных, внешними API. Моки используются реже.
    • Пример: Проверка, что после вызова API-эндпоинта для создания пользователя в базе данных действительно появляется новая запись.

      # Интеграционный тест (упрощенно)
      def test_user_creation_endpoint_and_db():
          # 1. Отправляем запрос на API-эндпоинт
          response = client.post("/users", json={"name": "Alice"})
          assert response.status_code == 201
      
          # 2. Проверяем состояние базы данных
          user = db_session.query(User).filter_by(name="Alice").first()
          assert user is not None
  3. Функциональные тесты (Functional Tests)

    • Цель: Проверить, соответствует ли функциональность системы бизнес-требованиям с точки зрения пользователя.
    • Фокус: Поведение системы в целом, проверка пользовательских сценариев. Отвечает на вопрос: "Выполняет ли система то, что от нее требуется?".
    • Пример: Тестирование полного сценария регистрации: пользователь заходит на страницу, вводит данные, нажимает кнопку, получает письмо и подтверждает аккаунт.

Ключевое отличие:

  • Интеграционный тест проверяет, что модуль А правильно отправляет данные в модуль Б.
  • Функциональный тест проверяет, что пользователь может успешно зарегистрироваться, что может включать в себя взаимодействие модулей А, Б, В и Г.