【发布时间】:2018-01-11 17:23:56
【问题描述】:
我有一个带有 POST 端点的 Flask 应用程序,我想测试它。端点执行一些数据库修改,在这种特殊情况下,我试图断言使用特定数据集调用端点不会更改数据库。
我的数据库模型有一个 pytest 夹具,一个在数据库事务中运行测试的 autouse=True 夹具,以及一个用于生成 Flask test_client 的夹具:
@pytest.fixture()
def myfixture():
return MyModel.create(...)
@pytest.fixture
def testapp():
app.config['TESTING'] = True
with app.app_context():
yield app.test_client()
@pytest.fixture(autouse=True)
def with_database_txn():
with db.atomic() as txn:
yield
txn.rollback()
这对于大多数测试都非常有效。但是,当我测试调用我的端点时,我的数据库记录遇到了一个奇怪的问题:
def test_endpoint(myfixture, testapp):
assert MyModel.select().count() == 1
r = app.test_client().post('/endpoint', headers={...}, data=json.dumps({...}))
assert r.status_code == 200
assert r.data.decode() == 'no changes'
assert MyModel.select().count() == 1
我在最终的assert 上测试失败,声称MyModel.select().count 已变为0。在请求返回之前记录仍然存在,我已经在 /endpoint 的处理程序中验证了这一点。
我假设(甚至猜测)pytest 的装置、peewee 的事务和flask 的请求上下文之间发生了一些奇怪的交互,导致事务回滚在第二个断言被击中之前,但我找不到任何关于可能发生的事情的信息。
在DEBUG 级别查看peewee 的日志并没有提供任何高于夹具插入和记录选择的信息,尽管有趣的是它也根本没有显示任何与事务有关的信息,我敢肯定它曾经是……确凿无疑的,还是只是最近版本的更改?
无论哪种方式,任何帮助追踪正在发生的事情都将非常感激!
【问题讨论】:
-
您能添加您的
endpoint代码吗?您如何在项目和测试中初始化app? -
@DanilaGanchar 这最终证明是我的错误,看看我的回答!
标签: python postgresql flask pytest peewee