【问题标题】:Testing a Flask endpoint using peewee transactions and pytest使用 peewee 事务和 pytest 测试 Flask 端点
【发布时间】: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


【解决方案1】:

最后证明这是我的一个错误——在我代码深处的某个地方的另一个调用中关闭了数据库。抱歉打扰了!

【讨论】:

    猜你喜欢
    • 2020-03-15
    • 2020-05-27
    • 2017-01-28
    • 2019-02-08
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 2023-02-25
    • 1970-01-01
    相关资源
    最近更新 更多