Тестирование. Заменить 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 шт):

Автор решения: aleksv

Я предлагаю следующее решение: создаем фикстуру на тесты и в ней переписываем подключение к БД.

Пример:

@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
→ Ссылка
Автор решения: Roman-Stop RU aggression in UA

Сделайте возможность задания конфигурации приложения с помощью переменных окружения. Это в любом случае полезно, обычно в разных средах разные параметры.

То есть, если сейчас у вас параметр зашит в код:

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
→ Ссылка