我正在尝试使用 Flask-SQLAlchemy 构建 Flask 应用程序;我使用 pytest 来测试数据库。问题之一似乎是在不同测试之间创建隔离的数据库会话。
我编写了一个最小的完整示例来突出问题,请注意test_user_schema1()
and 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
如果数据库在我的测试之间确实是隔离的,那么两个测试都应该通过。但是,最后一次测试总是失败,因为我还没有找到使数据库会话正确回滚的方法。
conftest.py
根据我所看到的使用以下内容亚历克斯·迈克尔的博客文章 http://alexmic.net/flask-sqlalchemy-pytest/,但是这个固定装置代码中断了,因为它显然没有隔离固定装置之间的数据库会话。
@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 https://gist.github.com/mpenning/34fa8d274fc4be240933,其中包含复制它所需的所有内容;你可以克隆它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 装置似乎对其他人有用。
- 我该如何解决这个问题才能正常工作?