首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >pytest-django将夹具添加到live_server夹具中

pytest-django将夹具添加到live_server夹具中
EN

Stack Overflow用户
提问于 2018-09-28 19:45:51
回答 2查看 1.5K关注 0票数 5

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

尽管如此,我理解对数据库运行测试并不理想,但这正是我所使用的。

在我们的常规测试套件中,我们使用覆盖django_db_setupconftest.py文件中不做任何事情,如下所示

代码语言:javascript
复制
@pytest.fixture(scope="session")
def django_db_setup():
    pass

看来,当我使用由live_server提供的pytest-django夹具时,它并不尊重这一点,因为它试图在测试结束时刷新数据库。怎样才能避开这一切呢?我已经找到了如下所示的结尾,但是如果有更好的解决方案,我想避免它。

代码语言:javascript
复制
@pytest.fixture(scope='session')
def my_live_server(request):
    request.getfixturevalue('django_db_setup')
    return live_server(request)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-04 16:59:09

这就是我必须要做的才能避开它。但是,对于直接调用live_server夹具,我得到了一个最远的警告。这可以避免pytest<4

代码语言:javascript
复制
@pytest.fixture(scope="session")
def my_live_server(request):
    request.getfixturevalue("fixture_i_want")
    return live_server(request)
票数 0
EN

Stack Overflow用户

发布于 2018-09-29 17:00:41

看来,当我使用由live_server提供的pytest-django夹具时,它并不尊重这一点,因为它试图在测试结束时刷新数据库。

您是完全正确的;在测试中使用live-server夹具会悄然触发事务行为(就好像要将transactional_db夹具传递给测试一样)。AFAIK不能通过配置关闭(如果被证明是错误的,我将很高兴);一个人必须扰乱pytest-django的内部结构。

代码语言:javascript
复制
# 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)

当然,这不是一个很好的解决方案,但它确实奏效了。您至少可以通过引入自定义标记来“减轻可能的损害”,以便修补的帮助程序只应用于标记测试:

代码语言:javascript
复制
@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的测试。

代码语言:javascript
复制
@pytest.mark.live_server_no_flush
def test_spam(live_server):
    ...
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52561816

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档