Ответ
Тесты, которые взаимодействуют с реальными внешними зависимостями (базы данных, API, файловая система) без использования mock-объектов, относятся к интеграционным или сквозным (end-to-end) тестам.
Их цель — проверить корректность совместной работы нескольких компонентов системы.
- Интеграционные тесты проверяют взаимодействие между конкретными модулями. Например, как сервис работает с реальной базой данных.
- Сквозные (end-to-end) тесты проверяют полный пользовательский сценарий от начала до конца, имитируя действия реального пользователя через UI или API.
Пример интеграционного теста (pytest):
# tests/test_user_repository.py
def test_user_creation_in_db(database_session):
"""Проверяет создание и извлечение пользователя из реальной БД."""
# Действие: создаем и сохраняем пользователя
user_repo = UserRepository(database_session)
new_user = user_repo.create(name="Alice", email="alice@example.com")
# Проверка: извлекаем пользователя по ID и сверяем данные
retrieved_user = user_repo.get_by_id(new_user.id)
assert retrieved_user is not None
assert retrieved_user.name == "Alice"
Основное преимущество таких тестов — высокая достоверность, так как они проверяют систему в условиях, близких к реальным. Недостаток — они медленнее и сложнее в настройке по сравнению с юнит-тестами.
Ответ 18+ 🔞
Да ты посмотри, какие распиздяйства творятся в тестировании! Ну, блядь, сидят, понимаешь, и пишут тесты, которые лезут в настоящую базу данных, в живые API, в файлы — и всё это безо всяких моков, внатуре!
Это ж, ёпта, не юнит-тесты, это уже интеграционные или, того хуже, сквозные (end-to-end) тесты, блядь! Их задача — проверить, как эти, блядь, компоненты друг с другом в реальной жизни сработаются, а не в песочнице.
- Интеграционные — это когда, допустим, твой сервис пытается по-честному поебаться с базой данных, и смотрят, не обосрётся ли он на этом.
- Сквозные (end-to-end) — это вообще пиздец, полная симуляция пользователя: нажал кнопку — пошёл запрос — база дернулась — ответ пришёл — интерфейс обновился. Всё, как в жизни, только медленнее и дороже, блядь.
Вот тебе пример, как это выглядит в коде (pytest):
# tests/test_user_repository.py
def test_user_creation_in_db(database_session):
"""Проверяет создание и извлечение пользователя из реальной БД."""
# Действие: создаем и сохраняем пользователя
user_repo = UserRepository(database_session)
new_user = user_repo.create(name="Alice", email="alice@example.com")
# Проверка: извлекаем пользователя по ID и сверяем данные
retrieved_user = user_repo.get_by_id(new_user.id)
assert retrieved_user is not None
assert retrieved_user.name == "Alice"
Плюс этих тестов — они, сука, почти как в бою, высокая достоверность, блядь. А минус — нихуя не быстрые и настраивать их — тот ещё геморрой, по сравнению с юнитами, которые щёлкают как орехи. Вот такая, блядь, дилемма, в рот меня чих-пых!