Короткий ответ
Тестовый клиент позволяет отправить HTTP-запрос к приложению прямо в процессе теста, без поднятия реального сервера и сети, и проверить код ответа и тело в формате JSON.
Как это работает подробнее
TestClient (на базе httpx/requests) оборачивает ASGI/WSGI-приложение и вызывает его напрямую через интерфейс приложения, эмулируя полный цикл обработки запроса: маршрутизацию, middleware, валидацию входных данных, сериализацию ответа — но без реального сетевого сокета и реального порта, что делает такие тесты быстрыми и стабильными.
Пример кода
testing_example_303.py
from fastapi.testclient import TestClient
from myapp.main import app
client = TestClient(app)
def test_get_user_returns_200_and_correct_name():
response = client.get("/users/1")
assert response.status_code == 200
assert response.json()["name"] == "Ann"Что использовать на практике
- Практика. Такие тесты относят к так называемым component/API-тестам: они ближе к интеграционным, так как проходят через весь стек приложения — от роутинга до сериализации ответа, — но обычно всё ещё используют тестовую или замоканную БД вместо настоящей production-инфраструктуры и внешних сервисов.
Подводные камни
- Риск. Проверять только код статуса ответа (например, 200), игнорируя содержимое тела ответа, из-за чего тест не заметит, что вернулись пустые или неверные данные при формально успешном статусе. Не очищать состояние (БД, кеш) между такими тестами, из-за чего они начинают влиять друг на друга и давать разный результат в зависимости от порядка запуска.