FastAPI для начинающих: API с базой данных и тестамиТесты вместо ручного прокликиванияПервый тест API через TestClient

Первый тест API через TestClient

Уроки курсаПервый тест API через TestClient

В уроке26 POST /api/rooms/{room_id}/bookings научился отвечать201 при сохранении и409 при конфликте. Первый автоматический тест начнём с отдельного читающего приложения без базы: проверим GET комнаты и404. Запись в SQLite и сценарии бронирования подключим в уроках28–29.

TestClient: запрос к ASGI-приложению без Uvicorn

Когда вы запускаете приложение через uvicorn main:app, Uvicorn открывает сокет, слушает порт и по HTTP передаёт входящие байты в FastAPI. TestClient делает принципиально другое: он вызывает приложение напрямую через ASGI-интерфейс в том же Python-процессе. Никакого сетевого сокета, никакого порта — запрос идёт в памяти.

Технически TestClient из FastAPI — реэкспорт клиента Starlette, который внутри использует библиотеку httpx. Поэтому перед первым тестом нужно установить оба пакета:

python -m pip install "pytest==8.3.4" "httpx==0.28.1"

Импорт и минимальное создание клиента выглядят так:

from fastapi.testclient import TestClient
from demo_api import app

client = TestClient(app)

Однако в тестах предпочтительнее контекстный менеджер:

with TestClient(app) as client:
    response = client.get("/api/rooms/1")

Конструкция with делает две вещи: запускает lifespan-события приложения при входе в блок и корректно закрывает клиент при выходе. Это важно, если у приложения есть startup/shutdown обработчики — без with они просто не выполнятся.

Методы client.get(...), client.post(...), client.put(...) и остальные возвращают объект Response. Его можно сразу проверять: смотреть статус, разбирать тело.

Важный момент: отсутствие сети не означает изоляцию от данных. Если обработчик открывает файловую базу или меняет глобальный словарь, TestClient это не блокирует. Запрос просто идёт не через сокет, а через ASGI-вызов, но код обработчика выполняется полностью. Именно поэтому первый пример намеренно использует отдельное маленькое приложение с данными в памяти: никаких файлов, никаких побочных эффектов.