Макет URI базы данных SQLAlchemy с помощью pytest

#python #flask #sqlalchemy #pytest

#python #flask #sqlalchemy #pytest

Вопрос:

У меня есть приложение Flask, которое создается с помощью метода app factory:

appname/__init__.py

 from flask import Flask

def create_app():
    app = Flask(__name__)

    with app.app_context():
        from appname.db import db_session

    @app.teardown_appcontext
    def shutdown_session(exception=None):
        db_session.remove()

    return app

if __name__ == "__main__":
    app = create_app()
    app.run(port=5050)
  

URI для моей базы данных хранится в переменной среды и создается с использованием стандартного шаблона SQLAlchemy:

appname/db.py

 from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session, sessionmaker
from sqlalchemy.ext.declarative import declarative_base
import os

engine = create_engine(os.environ.get('DATABASE_URI'), echo=True)
db_session = scoped_session(sessionmaker(autocommit=False, autoflush=False, bind=engine))

Base = declarative_base()
Base.query = db_session.query_property()

def init_db():
    Base.metadata.create_all(bind=engine)
  

Эта настройка отлично подходит для разработки, но я не могу понять, как установить DATABASE_URI переменную для pytest. Прямо сейчас я должен указать его вместе с pytest командой:

 DATABASE_URI='postgresql://me@localhost/appname' pipenv run pytest
  

Пока это работает, я должен представить, что есть лучший способ предопределить среду для моего набора тестов. Каков наилучший способ установки этих переменных среды?

Комментарии:

1. Проверка pytest monkeypatch.setenv

Ответ №1:

Кажется, это работает:

test/conftest.py

 import pytest
from _pytest import monkeypatch
from appname import create_app


@pytest.fixture
def client():
    mp = monkeypatch.MonkeyPatch()
    mp.setenv('DATABASE_URI', 'postgresql://me@localhost/appname')
    app = create_app()
    client = app.test_client()

    yield client