我有一个通过应用程序工厂方法创建的Flask应用程序:
应用程序名称/ __ 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样板创建:
应用程序名称/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)
此设置可以很好地进行开发,但是我不知道如何为pytest设置DATABASE_URI
变量。现在,我必须将其与pytest
命令一起指定:
DATABASE_URI='postgresql://me@localhost/appname' pipenv run pytest
尽管这可行,但我必须想象有一种更好的方法来为我的测试套件预定义环境。设置这些环境变量的最佳做法是什么?
答案 0 :(得分: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