По долгу службы порой пишешь утилиты на python или небольшие backend системы. К одной из таких решил написать тесты с помощью pytest. Код на fastapi, асинхронный.
Структура:
tests
├── auth
│ └── test_login.py
├── conftest.py
Тут пример с тестом логина, для получения токена. Стандартная JWT авторизация.
В conftest.py:
import pytest_asyncio
from httpx import AsyncClient, ASGITransport
from src.main import app
from asgi_lifespan import LifespanManager
@pytest_asyncio.fixture
async def async_client():
async with LifespanManager(app):
transport = ASGITransport(app=app)
async with AsyncClient(
transport=transport, base_url="http://testserver"
) as client:
yield client
На реальный сервер запроса не будет, он поднимется внутри pytest, поэтому импортируем app.
Обязательно используйте
LifespanManager, если в main.py есть @lifespan или startup/shutdown-логика (например, подключение к БД). Без него — ошибки event loop'а гарантированы.Далее в тестах:
@pytest.mark.asyncio
async def test_login(async_client):
response = await async_client.post("/auth/jwt/login", data=...)
assert response.status_code == 200
#python