Тестирование. Заменить URL реальной базы на тестовую
Есть файл database с таким содержимым
engine = create_async_engine(settings.DATABASE_URL, echo=False, future=True)
async_session = sessionmaker(engine, class_=AsyncSession, expire_on_commit=False)
async def init_database():
async with engine.begin() as connection:
await connection.run_sync(SQLModel.metadata.create_all)
async def get_session() -> AsyncSession:
async with async_session() as session:
yield session
Как мне подменить при тестировании settings.DATABASE_URL на тестовую базу данных в conftest.py чтобы при каждом вызове get_session() в разных местах получать подключение к тестовой, а не реальной базе данных?
Ответы (2 шт):
Я предлагаю следующее решение: создаем фикстуру на тесты и в ней переписываем подключение к БД.
Пример:
@pytest.fixture(scope="function")
def temp_db() -> Generator:
engine = create_engine(TEST_DB_URL)
# Добавляете свои параметры на sessionmaker()
testing_session = sessionmaker()
# Здесь создаете метадату в зависимости от используемого подхода
Base.metadata.create_all(bind=engine)
def override_get_session():
try:
db = testing_session()
yield db
finally:
db.close() # noqa
# тут перезаписывайте зависимости своего приложения на метод get_session
try:
base = testing_session()
yield base
finally:
base.close() # noqa
Сделайте возможность задания конфигурации приложения с помощью переменных окружения. Это в любом случае полезно, обычно в разных средах разные параметры.
То есть, если сейчас у вас параметр зашит в код:
DATABASE_URL="some-url"
замените это на:
import os
DATABASE_URL=os.getenv('DATABASE_URL', "some-url")
Теперь при запуске можно указывать БД в переменной окружения.
В pytest для этого можно использовать плагины pytest-dotenv или pytest-env.
Для pytest-dotenv в pytest.ini добавьте конфигурацию:
[pytest]
env_files =
.test.env
А в файле .test.env задайте переменные окружения:
DATABASE_URL=some-test-db-url