
Как тестировать HTTP-запросы к внешним сервисам в Python-приложениях: requests-mock, pytest-httpx и FastAPI
ViAchKoN 2 минуты назад Как тестировать HTTP-запросы к внешним сервисам в Python-приложениях: requests-mock, pytest-httpx и FastAPI Средний 19 мин 1 Python * Туториал ВведениеЯ уже несколько лет работаю с...
GPT-5.6 31 Temmuz 2026'da yayınlanacak mı?
Значимый прорыв формирует отрасль ИИ: ViAchKoN 2 минуты назад Как тестировать HTTP-запросы к внешним сервисам в Python-приложениях: requests-mock, pytest-httpx и FastAPI Средний 19 мин 1 Python * Туториал ВведениеЯ уже несколько лет работаю с backend-приложениями на Python, и очень часто эти сервисы работают не только с обычной базой данных. Практически всегда приложениям нужно отправлять запросы во внешних сервис. Это может быть платежный сервис, пользовательский сервис, сервис доставки, сервис уведомлений или другой внутренний сервис.
Обычно при написании тестов для функционала, который использует внешние сервисы, используют mocker. Таким образом когда в приложении есть метод, который отправляет запрос во внешний сервис, этот метод всегда можно заменить в тесте и он будет возвращать заранее подготовленные данные. Данный подход достаточно легкий в использовании, но я не считаю, что он всегда должен быть подходом по умолчанию.
Технические детали
Проблема в том, что иногда мы замещаем слишком много. В этой статье я хочу показать другой подход – вместо того чтобы подменять ответ от внешнего сервиса, можно мокировать сам внешний HTTP-сервис. В примере есть два клиента, с помощью которых осуществляются внешние запросы:один клиент использует requests;другой клиент использует httpx.
Поэтому я покажу два типа моков:requests-mock для клиента на requests;pytest-httpx для клиента на httpx. Идея в обоих случаях одна и та же, отличается только инструмент. Пример приложенияРассмотрим приложение на FastAPI (но это может быть любой другой фреймворк).
Допустим помимо простых CRUD методов, у нас есть более усложненные . Эти методы работают с локальной базой данных, а затем отправляют данные во внешний сервис. Например, этот метод возвращает один item с дополнительными данными из внешнего сервиса:@app.
Отраслевые последствия
get( "/items/{client_type}/detailed/{item_id}", summary="Get an item with external service data", status_code=200, response_model=schemas. ItemDetailedSchema, ) def get_item_detailed( client_type: schemas. ClientType, item_id: int, ) -> schemas.
ItemDetailedSchema: if queries. get_item(item_id=item_id) is None: raise HTTPException(status_code=404, detail="Item not found if client_type == schemas. httpx: return external_httpx_client.
get_item(item_id=item_id) else: return external_requests_client. get_item(item_id=item_id) Метод выбирает нужный клиент по передоенному параметру client_type. Также есть более интересные методы — это PATCH и DELETE, потому что они изменяют данные.
Этот прогресс даёт важные сигналы о будущем отрасли, и технологический мир внимательно наблюдает.





