Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Python: mocking, HTTP client, unit testing, test isolation, network stubs

Как мокать HTTP-клиенты?

Этот вопрос проверяет умение изолировать тесты от внешних HTTP-зависимостей, что необходимо для создания быстрых, стабильных и воспроизводимых unit-тестов.

Короткий ответ

Мокать HTTP-клиенты — значит заменять реальные сетевые запросы на контролируемые заглушки в тестах. Это позволяет тестировать логику приложения, не завися от доступности внешних сервисов, их скорости или изменяющихся данных. Для этого используются библиотеки, которые перехватывают вызовы HTTP-клиента и возвращают заранее заданные ответы. Такой подход ускоряет тесты и делает их предсказуемыми.

Длинный ответ

Мокирование HTTP-клиентов — ключевая практика в модульном тестировании кода, который взаимодействует с внешними API или сервисами. Вместо реальных сетевых вызовов, которые могут быть медленными, неустойчивыми или требующими авторизации, мы подменяем клиент на объект-заглушку. Этот объект имитирует интерфейс реального клиента, но возвращает заранее подготовленные, детерминированные ответы.

Основные подходы к мокам

  • Использование специализированных библиотек: В экосистеме JavaScript популярны nock для Node.js и fetch-mock или msw (Mock Service Worker) для браузерных сред. В Python часто применяют responses для библиотеки requests или aioresponses для aiohttp.
  • Ручное создание мок-объектов: Можно создать класс или объект, реализующий тот же интерфейс, что и HTTP-клиент, и подменить его в системе внедрения зависимостей.
  • Использование встроенных возможностей фреймворков: Многие фреймворки для тестирования (например, Jest для JavaScript) предоставляют утилиты для мока модулей, включая модули, экспортирующие HTTP-клиенты.

Практический пример на Python с библиотекой requests

Рассмотрим функцию, которая получает данные пользователя с внешнего API. Мы протестируем её, замокав библиотеку requests с помощью unittest.mock.

import requests
from unittest.mock import Mock, patch

def get_user_data(user_id):
    """Функция, которую мы тестируем."""
    response = requests.get(f'https://api.example.com/users/{user_id}')
    if response.status_code == 200:
        return response.json()
    return None

# Тест с использованием мока
@patch('requests.get')  # Декоратор подменяет requests.get на мок

def test_get_user_data_success(mock_get):
    # 1. Настраиваем мок: какой ответ должен вернуться
    mock_response = Mock()
    mock_response.status_code = 200
    mock_response.json.return_value = {'id': 123, 'name': 'John'}
    mock_get.return_value = mock_response

    # 2. Вызываем тестируемую функцию
    result = get_user_data(123)

    # 3. Проверяем, что функция вернула ожидаемые данные
    assert result == {'id': 123, 'name': 'John'}
    # 4. Проверяем, что запрос был выполнен с правильным URL
    mock_get.assert_called_once_with('https://api.example.com/users/123')

В этом примере декоратор @patch временно заменяет requests.get на объект-мок. Мы настраиваем этот мок так, чтобы он возвращал фиктивный ответ с нужным статусом и данными. Это позволяет проверить логику функции get_user_data без реального сетевого запроса.

Где и зачем это применяется

Моки HTTP особенно полезны в unit-тестах, интеграционных тестах (для изоляции тестируемого сервиса) и при разработке, когда внешний API ещё не готов или недоступен. Они также позволяют легко тестировать обработку ошибок сети (например, таймауты или коды 5xx), симулируя такие сценарии.

Вывод: Мокать HTTP-клиенты стоит всегда, когда вы пишете тесты, которые не должны зависеть от внешней сети. Это делает тестовый набор быстрым, надёжным и независимым от состояния внешних систем, что является краеугольным камнем качественного CI/CD-процесса.

Уровень

  • Рейтинг:

    4

  • Сложность:

    4

Навыки

  • Python

    Python

  • Testing

Ключевые слова

#mocking

#HTTP client

#unit testing

#test isolation

#network stubs

Подпишись на Java Developer в телеграм