Щоб почати тестувати наші 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 автоматично передастьclientу тест.
Налаштування 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-запитів. Побачимося! 🚀
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ