Pytest с деталями базы данных из командной строки и фикстур - PullRequest
1 голос
/ 28 июня 2019

Я пытаюсь инициализировать БД для pytest через значения, переданные из командной строки. Я не могу указать значения в другом тесте setting.py и не могу указать его в параметре TEST в settings.py; это доступно только через командную строку.

Я установил дополнительные параметры командной строки в confttest.py, чтобы получить подробную информацию о БД:

def pytest_addoption(parser):
    parser.addoption(
        "--dbconnection", action="store", default = "novalue", help="test db value"
    )

Есть ли способ получить доступ к этим значениям в conftest.py? AFAIK, я могу использовать приборы для получения значения в тесте, но я бы хотел переопределить django_db_modify_db_settings для изменения базы данных с помощью этих аргументов командной строки.

Возможно ли это? База данных инициализируется перед обработкой командной строки? Я попробовал несколько экспериментов, и это выглядит так. Есть ли другой способ обойти это?

1 Ответ

1 голос
/ 28 июня 2019

Есть ли какой-либо способ, которым я могу получить доступ к этим значениям в conftest.py?

Вы можете получить доступ к аргументам командной строки во всех приборах (через request.config) и (большинство) ловушекimpls.

Инициализирована ли база данных до обработки командной строки?

Нет, база данных инициализируется намного позже, после анализа командной строки.Аргументы командной строки становятся доступными в pytest_configure перехватах, и соединение с базой данных не инициализируется до фиксатора django_db_setup, то есть до первого вызова pytest_runtest_setup перехватчиков.

Пример, расширенный из вашего addopt hook:

import pytest


def pytest_addoption(parser):
    parser.addoption(
        "--dbconnection", action="store", default = "novalue", help="test db value"
    )


@pytest.fixture(scope='session')
def django_db_modify_db_settings(request):
    from django.conf import settings
    testdb_settings = settings.DATABASES['default']['TEST']
    dbconn = request.config.getoption('--dbconnection')
    if dbconn == 'infile':
        testdb_settings['NAME'] = '/tmp/testdb.sqlite'
    elif dbconn == 'inmem':
        testdb_settings['NAME'] = ':memory:'
    else:
        raise RuntimeError('Unknown option value.')

При запуске pytest --dbconnection=inmem будет использоваться БД в памяти, при запуске pytest --dbconnection=infile будет использоваться файл (вы можете повторно запустить с --reuse-db, чтобы убедиться, что файл БД создан).

...