【发布时间】:2015-02-15 13:53:51
【问题描述】:
我正在尝试使用 Flask-SQLAlchemy 构建一个 Flask 应用程序;我使用 pytest 来测试数据库。问题之一似乎是在不同测试之间创建了隔离的数据库会话。
我制作了一个最小的完整示例来突出问题,请注意test_user_schema1() 和test_user_schema2() 是相同的。
文件名:test_db.py
from models import User
def test_user_schema1(session):
person_name = 'Fran Clan'
uu = User(name=person_name)
session.add(uu)
session.commit()
assert uu.id==1
assert uu.name==person_name
def test_user_schema2(session):
person_name = 'Stan Clan'
uu = User(name=person_name)
session.add(uu)
session.commit()
assert uu.id==1
assert uu.name==person_name
如果数据库在我的测试之间真正隔离,则两个测试都应该通过。但是,最后一次测试总是失败,因为我还没有找到让 db session 正确回滚的方法。
conftest.py 根据我在Alex Michael's blog post 中看到的内容使用以下内容,但是这个夹具代码中断,因为它显然没有隔离夹具之间的数据库会话。
@pytest.yield_fixture(scope='function')
def session(app, db):
connection = db.engine.connect()
transaction = connection.begin()
#options = dict(bind=connection, binds={})
options = dict(bind=connection)
session = db.create_scoped_session(options=options)
yield session
# Finalize test here
transaction.rollback()
connection.close()
session.remove()
出于这个问题的目的,我构建了 a gist,其中包含了重现它所需的所有内容;你可以用git clone https://gist.github.com/34fa8d274fc4be240933.git克隆它。
我正在使用以下软件包...
Flask==0.10.1
Flask-Bootstrap==3.3.0.1
Flask-Migrate==1.3.0
Flask-Moment==0.4.0
Flask-RESTful==0.3.1
Flask-Script==2.0.5
Flask-SQLAlchemy==2.0
Flask-WTF==0.11
itsdangerous==0.24
pytest==2.6.4
Werkzeug==0.10.1
两个问题:
- 为什么会打破现状?同样的 py.test 固定装置似乎也适用于其他人。
- 如何解决此问题才能正常工作?
【问题讨论】:
标签: python unit-testing flask flask-sqlalchemy pytest