pytest-django将灯具添加到live_server灯具

时间:2018-09-28 19:45:52

标签: python django pytest pytest-django

我需要将灯具添加到live_server提供的pytest-django灯具中,特别是要覆盖django_db_setup

话虽这么说,但我理解对未冲洗干净的数据库运行测试不是理想的选择,但这正是我正在使用的。

在我们的常规测试套件中,我们使用django_db_setup覆盖conftest.py文件中的任何操作,如下所示

@pytest.fixture(scope="session")
def django_db_setup():
    pass

看来,当我使用live_server提供的pytest-django固定装置时,由于在尝试结束时尝试刷新db时,它不兑现这一要求。人们将如何规避这一点?我发现下面有一个结尾,但是如果有更好的解决方案,我想避免它。

@pytest.fixture(scope='session')
def my_live_server(request):
    request.getfixturevalue('django_db_setup')
    return live_server(request)

2 个答案:

答案 0 :(得分:1)

  

看来,当我使用live_server提供的pytest-django固定装置时,由于尝试在测试结束时刷新db,所以它不兑现。

您绝对正确;在测试中使用live-server固定装置将无提示地触发事务行为(就像您将transactional_db固定装置传递给测试一样)。 AFAIK无法通过配置将其关闭(如果证明错误,我将非常高兴);必须要弄乱pytest-django的内部结构。在您的conftest.py中:

# conftest.py

import pytest

@pytest.fixture(scope="session")
def django_db_setup():
    pass

@pytest.fixture(autouse=True, scope='function')
def _live_server_helper(request):
    if 'live_server' not in request.funcargnames:
        return

    request.getfixturevalue('django_db_setup')

    live_server = request.getfixturevalue('live_server')
    live_server._live_server_modified_settings.enable()
    request.addfinalizer(live_server._live_server_modified_settings.disable)

当然,这不是一个很好的解决方案,但是可以解决问题。通过引入自定义标记,您至少可以“减轻可能的损害”,以便将修补的助手仅应用于标记的测试:

@pytest.fixture(autouse=True, scope='function')
def _live_server_helper(request):
    markers = [marker.name for marker in request.node.iter_markers()]
    if 'live_server_no_flush' not in markers:
        request.getfixturevalue('_live_server_helper')
        return

    # rest of code same as above
    if 'live_server' not in request.funcargnames:
        return

    request.getfixturevalue('django_db_setup')

    live_server = request.getfixturevalue('live_server')
    live_server._live_server_modified_settings.enable()
    request.addfinalizer(live_server._live_server_modified_settings.disable)

现在,新行为仅适用于标有live_server_no_flush的测试:

@pytest.mark.live_server_no_flush
def test_spam(live_server):
    ...

答案 1 :(得分:0)

这是我必须解决的问题。但是,我收到直接调用live_server固定装置的pytest警告。可以避免pytest <4

@pytest.fixture(scope="session")
def my_live_server(request):
    request.getfixturevalue("fixture_i_want")
    return live_server(request)