Как тестировать эндпоинты в FastAPI

Ответ

Для тестирования эндпоинтов FastAPI используется класс TestClient, который поставляется вместе с фреймворком.

Он построен на базе библиотеки httpx и позволяет отправлять HTTP-запросы к приложению напрямую, без запуска реального веб-сервера. Это делает тесты быстрыми, надежными и изолированными.

Пример интеграционного теста:

from fastapi import FastAPI
from fastapi.testclient import TestClient

# Создаем экземпляр приложения
app = FastAPI()

@app.get("/")
async def read_root():
    return {"message": "Hello World"}

# Создаем клиент, передав ему экземпляр приложения FastAPI
client = TestClient(app)

def test_read_root():
    # Отправляем GET-запрос к эндпоинту "/"
    response = client.get("/")

    # Проверяем код ответа и тело ответа
    assert response.status_code == 200
    assert response.json() == {"message": "Hello World"}

Почему TestClient — это лучший подход:

  • Скорость: Тесты выполняются в памяти без реальных сетевых задержек.
  • Изоляция: Каждый тест может работать с чистым экземпляром приложения.
  • Полная поддержка FastAPI: Корректная работа с зависимостями (Dependencies), middleware и асинхронными операциями.

Ответ 18+ 🔞

Смотри, вот тебе про тестирование в FastAPI, но без этой академической сухости, а как есть, по-человечьи.

Ну и хули там тестировать-то, спросишь? А вот представь: написал ты роут, он вроде работает. А потом бац — обновил что-то, и всё, пиздец, всё сломалось. Чтобы не бегать каждый раз с постманом, как ошалелый, и придумали TestClient. Это такая штука, которая притворяется браузером, но работает прямо в памяти, без всяких там серверов и портов. Быстро, блядь, и изолированно.

Вот смотри, как это выглядит в деле, ёпта:

from fastapi import FastAPI
from fastapi.testclient import TestClient

# Создаём наше приложение, как обычно
app = FastAPI()

@app.get("/")
async def read_root():
    return {"message": "Hello World"}

# А вот и наш волшебный клиент для тестов. Даём ему наше приложение.
client = TestClient(app)

def test_read_root():
    # Говорим клиенту: "Слушай, сходи на главную страницу, сделай вид, что ты браузер"
    response = client.get("/")

    # А теперь проверяем: "Ну что, сука, статус 200 пришёл?"
    assert response.status_code == 200
    # "И JSON тот самый, который мы ожидали, или опять какая-то хуйня?"
    assert response.json() == {"message": "Hello World"}

И вся фишка в чём? Всё это дело крутится прямо в оперативке. Никаких реальных сетевых соединений, никакого ожидания, пока сервер поднимется. Овердохуища быстро. И главное — он понимает всю эту вашу FastAPI-магию: зависимости, мидлвари, асинхронность. Не тупая обёртка, а полноценный инструмент.

Короче, не изобретай велосипед, не городи костыли из requests. Бери TestClient и пиши тесты. А то потом будешь сидеть и думать: «И кто ж это, блядь, так накосячил?», а окажется, что это ты сам, полгода назад.