Чтобы начать тестировать наши FastAPI-приложения, сначала нужно убедиться, что у нас установлен Pytest. Если вы его ещё не устанавливали… что ж, это дело поправимое. Используем стандартный pip:
pip install pytest
После установки Pytest будет доступен как команда в вашем терминале. Чтобы убедиться, что всё работает, выполните:
pytest --version
Вы увидите что-то вроде:
pytest 8.x.x
Поздравляю, первый шаг сделан! 🎉
Теперь нам нужно установить ещё одну важную библиотеку для тестирования FastAPI-приложений: httpx, которая будет использоваться вместе с TestClient из FastAPI.
pip install httpx
Теперь у нас есть всё необходимое для тестирования. Давайте настроим проект.
🏗️ Настройка тестового окружения
Чтобы тесты в вашем проекте не превращались в хаос (и чтобы ваши коллеги перестали шёпотом называть ваш код "спагетти"), важно организовать их правильно. В корне FastAPI-проекта создайте каталог tests:
my_fastapi_project/
├── app/
│ ├── main.py
│ ├── routes.py
│ └── ...
├── tests/
│ ├── __init__.py
│ ├── test_main.py
│ └── ...
├── requirements.txt
└── ...
Этот каталог будет содержать все ваши тесты. Файл __init__.py нужен для того, чтобы Python считал каталог модулем (да-да, это важно, даже если никто не знает, зачем он там нужен).
Первый тестовый файл
Создадим файл test_main.py в каталоге tests:
# tests/test_main.py
def test_example():
assert 1 + 1 == 2 # Простая проверка, чтобы убедиться, что Pytest работает
Теперь запустим Pytest командой:
pytest
Если всё настроено правильно, вы увидите зелёное сообщение примерно такого вида:
=========================== test session starts ===========================
collected 1 item
tests/test_main.py . [100%]
============================ 1 passed in 0.02s =============================
Поздравляю, вы только что запустили ваш первый тест! 🎉 Пока это банальная проверка, но дальше будет интереснее.
Настройка конфигурации Pytest
С помощью Pytest можно настраивать поведение тестов через файл конфигурации. В корне проекта создайте файл pytest.ini:
# pytest.ini
[pytest]
addopts = -v
testpaths = tests
addopts = -vвключает "подробный режим" запуска тестов (verbose), чтобы вы могли видеть больше информации о происходящем.testpaths = testsуказывает, что все тесты находятся в каталогеtests.
Теперь запустите Pytest ещё раз и обратите внимание на более подробный вывод:
tests/test_main.py::test_example PASSED [100%]
Гораздо приятнее видеть имя теста, правда?
Использование фикстур в Pytest
Фикстуры — это мощная фишка Pytest. Она позволяет подготовить тестовое окружение перед запуском тестов. Например, для FastAPI мы будем использовать фикстуру для создания клиента TestClient.
Обновим файл test_main.py:
from fastapi.testclient import TestClient
from app.main import app
import pytest
# Создание фикстуры клиента
@pytest.fixture
def client():
return TestClient(app)
# Использование фикстуры в тесте
def test_root(client):
response = client.get("/")
assert response.status_code == 200
assert response.json() == {"message": "Hello World"}
Что здесь происходит:
- Мы импортируем
TestClientиз FastAPI и создаём фикстуруclient. - Фикстура возвращает клиент, который будет использоваться для отправки запросов к нашему приложению.
- В тесте
test_rootмы используем эту фикстуру как параметр функции. Pytest автоматически передаёт клиент в тест.
Настройка CI/CD для тестов
Хотя мы углубимся в CI/CD позже, полезно настроить автоматический запуск тестов на этапе разработки. Например, вы можете добавить команду для запуска тестов в GitHub Actions:
Создайте файл .github/workflows/ci.yml:
name: CI
on:
push:
branches:
- main
pull_request:
jobs:
test:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Set up Python
uses: actions/setup-python@v2
with:
python-version: 3.12
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
pip install pytest httpx
- name: Run tests
run: pytest
Теперь каждый раз, когда вы пушите изменения в main-ветку (или открываете pull request), GitHub будет автоматически запускать ваши тесты.
Где могут быть проблемы?
- Если Pytest не запускается, убедитесь, что пакет установлен и его видно в вашем окружении (
pytest --version). - Убедитесь, что тесты расположены в папке
testsи имеют имена, начинающиеся сtest_. - Если приложение не доступно для тестов, проверьте, правильно ли передан экземпляр FastAPI-приложения (
from app.main import app).
Теперь ваше FastAPI-приложение готово к тому, чтобы стать не только функциональным, но и протестированным (а значит, более стабильным). На следующей лекции мы начнём тестировать реальные эндпоинты, начиная с GET-запросов. Увидимся! 🚀
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ