Какие типы тестов выполняются без использования mock-объектов

Ответ

Тесты, которые взаимодействуют с реальными внешними зависимостями (базы данных, 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"

Плюс этих тестов — они, сука, почти как в бою, высокая достоверность, блядь. А минус — нихуя не быстрые и настраивать их — тот ещё геморрой, по сравнению с юнитами, которые щёлкают как орехи. Вот такая, блядь, дилемма, в рот меня чих-пых!