pytest-django добавляет приспособления к приспособлению live_server - PullRequest
0 голосов
/ 28 сентября 2018

Мне нужно добавить приборы к приспособлению 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, это не соблюдается, так как он пытается очистить базу данных в конце тестов.Как можно обойти это?Я нашел конец, показанный ниже, но я бы хотел избежать его, если есть лучшее решение.

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

Ответы [ 2 ]

0 голосов
/ 04 апреля 2019

Это то, что я должен был сделать, чтобы обойти это.Однако я получаю предупреждение о том, что напрямую вызывал прибор live_server.Этого можно избежать pytest <4 </p>

@pytest.fixture(scope="session")
def my_live_server(request):
    request.getfixturevalue("fixture_i_want")
    return live_server(request)
0 голосов
/ 29 сентября 2018

Похоже, что когда я использую приспособление 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):
    ...
...