Ответ
Для тестирования эндпоинтов 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 и пиши тесты. А то потом будешь сидеть и думать: «И кто ж это, блядь, так накосячил?», а окажется, что это ты сам, полгода назад.