Этот вопрос объясняет, как создать фикстуру в pytest для управления состоянием базы данных перед и после тестов.
Используйте фикстуру с yield для разделения кода setup и teardown. Перед тестом создаётся соединение с БД, после — закрывается. Для этого подходят библиотеки pytest-postgresql или кастомные решения с SQLAlchemy.
1. Фикстура с yield:
import pytest
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
@pytest.fixture
def db_session():
# Setup: создание соединения
engine = create_engine("postgresql://user:pass@localhost/test_db")
Session = sessionmaker(bind=engine)
session = Session()
yield session # Тест использует session здесь
# Teardown: закрытие соединения
session.close()
engine.dispose()2. Пример теста:
def test_user_creation(db_session):
user = User(name="Alice")
db_session.add(user)
db_session.commit()
assert db_session.query(User).count() == 13. Альтернатива с contextlib:
from contextlib import contextmanager
@contextmanager
def temp_db():
engine = create_engine("sqlite:///:memory:")
Base.metadata.create_all(engine)
yield engine
Base.metadata.drop_all(engine)Вывод:
Фикстуры с yield — самый чистый способ управлять ресурсами в pytest.