Ответ
Основное различие — в цели и уровне абстракции. Хотя эти понятия часто пересекаются, у них разный фокус.
Чтобы понять разницу, полезно рассмотреть три основных уровня тестирования:
-
Модульные тесты (Unit Tests)
- Цель: Проверить наименьшую изолированную часть кода (функцию, метод, класс).
- Фокус: Корректность логики одного компонента. Внешние зависимости (БД, API) обычно заменяются моками (заглушками).
-
Пример:
# Функция, которую тестируем def add(a, b): return a + b # Модульный тест def test_add(): assert add(2, 3) == 5 assert add(-1, 1) == 0
-
Интеграционные тесты (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
-
Функциональные тесты (Functional Tests)
- Цель: Проверить, соответствует ли функциональность системы бизнес-требованиям с точки зрения пользователя.
- Фокус: Поведение системы в целом, проверка пользовательских сценариев. Отвечает на вопрос: "Выполняет ли система то, что от нее требуется?".
- Пример: Тестирование полного сценария регистрации: пользователь заходит на страницу, вводит данные, нажимает кнопку, получает письмо и подтверждает аккаунт.
Ключевое отличие:
- Интеграционный тест проверяет, что модуль А правильно отправляет данные в модуль Б.
- Функциональный тест проверяет, что пользователь может успешно зарегистрироваться, что может включать в себя взаимодействие модулей А, Б, В и Г.