Современная веб-разработка требует не только быстрого создания API, но и обеспечения их надежности. FastAPI, благодаря своей скорости и простоте, стал популярным фреймворком для построения API на Python. Однако без надлежащего тестирования даже самый элегантный код может стать источником ошибок. Данная инструкция проведет вас от основ тестирования до продвинутых практик, обеспечив уверенность в вашем приложении.
Первый шаг — настройка окружения. Убедитесь, что у вас установлен Python (рекомендуется версия 3.7+). Создайте виртуальное окружение, чтобы изолировать зависимости проекта. Активируйте его и установите необходимые пакеты: `pip install fastapi uvicorn pytest httpx`. Pytest будет нашим основным фреймворком для тестирования, а httpx — асинхронным HTTP-клиентом для отправки запросов к нашему приложению в тестах.
Давайте создадим простое приложение для тестирования. Создайте файл `main.py`. Внутри определите базовое приложение FastAPI с несколькими эндпоинтами: GET для получения приветствия, POST для создания элемента и GET с параметром пути. Это даст нам материал для разных видов тестов. Не забудьте использовать Pydantic модели для валидации данных в запросе и ответе — это одна из сильных сторон FastAPI, которую также нужно проверять.
Теперь перейдем к структуре тестов. Создайте директорию `tests` на одном уровне с `main.py`. Внутри создайте файл `test_main.py`. Pytest автоматически обнаружит файлы, начинающиеся с `test_`. Первое, что нужно протестировать — это отдельные функции, не зависящие от самого API. Например, если у вас есть вспомогательные функции для обработки данных, напишите для них unit-тесты. Используйте стандартные утверждения (assert) pytest.
Следующий уровень — интеграционное тестирование самих эндпоинтов. Для этого мы будем использовать `TestClient` из `fastapi.testclient`. Импортируйте ваше приложение (`app`) из `main` и создайте клиент: `client = TestClient(app)`. Теперь вы можете писать тестовые функции, которые отправляют HTTP-запросы. Протестируйте ваш GET-эндпоинт: `response = client.get("/")`. Проверьте статус-код (`assert response.status_code == 200`) и содержимое ответа (`assert response.json() == {"message": "Hello World"}`).
Для тестирования POST-запросов необходимо отправлять данные. Создайте словарь с тестовыми данными, соответствующими вашей Pydantic-модели, и передайте его в `client.post("/items/", json=test_data)`. Проверьте, что ответ имеет статус 201 или 200, и что возвращенные данные корректны. Также важно тестировать обработку ошибок. Отправьте невалидные данные (например, строку вместо числа в поле) и убедитесь, что API возвращает статус 422 (Unprocessable Entity) с деталями ошибки — FastAPI делает это автоматически.
Особенность FastAPI — поддержка асинхронных эндпоинтов. Для их тестирования `TestClient` работает корректно, так как он запускает приложение в фоновом режиме. Однако если вам нужно протестировать сложную асинхронную логику внутри функций, может потребоваться использование `pytest.mark.asyncio`. Установите дополнительный пакет `pytest-asyncio`. Помечайте асинхронные тестовые функции декоратором `@pytest.mark.asyncio` и используйте `await` внутри них.
Не забывайте про тестирование зависимостей (Dependencies). FastAPI позволяет внедрять зависимости в эндпоинты, например, для проверки аутентификации. В тестах вы можете переопределить эти зависимости, чтобы они возвращали тестовые данные. Используйте `app.dependency_overrides` для подмены исходной зависимости на mock-объект или простую функцию. Это изолирует тест от внешних систем, таких как базы данных или сервисы аутентификации.
Для работы с базой данных в тестах лучшая практика — использование тестовой базы. Поднимайте и опускайте ее для каждого теста или тестовой сессии с помощью фикстур pytest. Фикстуры — это мощный инструмент для настройки состояния перед тестом. Создайте фикстуру, которая создает соединение с тестовой БД, применяет миграции, а после теста откатывает изменения и закрывает соединение. Это гарантирует, что тесты не влияют друг на друга.
Покрытие кода (code coverage) — полезная метрика. Установите `pytest-cov` и запускайте тесты с флагом `--cov`. Это покажет, какая часть вашего кода выполняется во время тестов. Стремитесь к высокому покрытию, но помните, что 100% покрытие не равно отсутствию багов. Важнее писать содержательные тесты, проверяющие бизнес-логику и пограничные случаи.
Наконец, интегрируйте тестирование в ваш процесс разработки. Настройте GitHub Actions, GitLab CI или другой инструмент непрерывной интеграции (CI), чтобы тесты запускались автоматически при каждом пуше в репозиторий. Это предотвратит попадание сломанного кода в основную ветку. Тестирование FastAPI — не обуза, а инвестиция в стабильность и поддерживаемость вашего API. Начните с простых unit-тестов, постепенно переходя к интеграционным, и ваше приложение станет надежным фундаментом для любого сервиса.
Как тестировать FastAPI: пошаговая инструкция с нуля
Пошаговая инструкция по настройке окружения, написанию unit- и интеграционных тестов для приложений на FastAPI с использованием pytest, TestClient и работы с асинхронностью, зависимостями и базой данных.
225
1
Комментарии (11)