Какой тип тестов использует mock-объекты для изоляции кода

Ответ

Тесты, в которых для изоляции тестируемого компонента используются mock-объекты (заглушки), называются модульными (unit-тестами).

Цель — проверить логику одного модуля (функции, класса) в изоляции от его зависимостей (например, базы данных, внешнего API или других частей системы).

Пример с unittest.mock в Python:

Предположим, есть функция, которая обращается к внешнему сервису для получения данных о погоде.

from unittest.mock import Mock

# Функция, которую мы тестируем
def get_weather_message(weather_api):
    temp = weather_api.get_temperature()
    if temp < 0:
        return "Очень холодно!"
    return "Погода в норме."

# Тест для этой функции
def test_cold_weather_message():
    # 1. Настройка (Arrange): создаем mock-объект API
    mock_api = Mock()
    # Задаем поведение: метод get_temperature() вернет -5
    mock_api.get_temperature.return_value = -5

    # 2. Действие (Act): вызываем функцию с mock-объектом
    message = get_weather_message(mock_api)

    # 3. Проверка (Assert): убеждаемся, что функция вернула правильное сообщение
    assert message == "Очень холодно!"
    # Проверяем, что метод mock-объекта был вызван
    mock_api.get_temperature.assert_called_once()

Ключевые преимущества:

  • Скорость: Выполняются очень быстро, так как не требуют реальных I/O операций.
  • Изоляция: Позволяют тестировать один компонент, не беспокоясь о работоспособности других.
  • Контроль: Дают полный контроль над поведением зависимостей (например, имитация ошибок API).

Ответ 18+ 🔞

Слушай, а вот эти тесты, где ты вместо настоящих зависимостей подсовываешь какие-то муляжи — это же и есть те самые модульные тесты, ёпта! Суть в том, чтобы проверить одну конкретную функцию или класс, отъединив его от всей остальной ебалы вроде баз данных или внешних сервисов. Чистая логика, без лишнего геморроя.

Вот смотри, как это выглядит на практике с unittest.mock в Python. Допустим, у нас есть функция, которая лезет за погодой в какой-то внешний API.

from unittest.mock import Mock

# Функция, которую мы тестируем
def get_weather_message(weather_api):
    temp = weather_api.get_temperature()
    if temp < 0:
        return "Очень холодно!"
    return "Погода в норме."

# Тест для этой функции
def test_cold_weather_message():
    # 1. Настройка (Arrange): создаем mock-объект API
    mock_api = Mock()
    # Задаем поведение: метод get_temperature() вернет -5
    mock_api.get_temperature.return_value = -5

    # 2. Действие (Act): вызываем функцию с mock-объектом
    message = get_weather_message(mock_api)

    # 3. Проверка (Assert): убеждаемся, что функция вернула правильное сообщение
    assert message == "Очень холодно!"
    # Проверяем, что метод mock-объекта был вызван
    mock_api.get_temperature.assert_called_once()

И в чём же, блядь, профит? А профит — овердохуищный!

  • Скорость пиздец: Тесты летают, потому что никаких реальных запросов в сеть или базу — чистая симуляция.
  • Полная изоляция: Ты тестируешь именно свою логику, а не то, работает ли сегодня какой-то левый сервис или не сдохла ли база. Если тест падает — виноват твой код, а не интернет-провайдер.
  • Тотальный контроль: Хочешь — имитируй успешный ответ, хочешь — кинь исключение, как будто сервис лёг. Можно протестировать вообще любые, даже самые ебнутые сценарии. Красота, а не жизнь!