带有来自命令行和固定装置的数据库详细信息的 pytest
pytest with database details from command line and fixtures
我正在尝试通过从命令行传递的值来初始化 pytest 的数据库。我无法在不同的测试 setting.py 中指定值,也无法在 settings.py 的 TEST 选项中指定它;它只能通过命令行使用。
我在 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
来更改数据库。
这可能吗?在处理命令行之前是否初始化了数据库?我尝试了一些实验,看起来确实如此。有没有其他解决方法可以使它正常工作?
Is there any way I can access these values in conftest.py?
您可以访问所有装置(通过 request.config
)和(大多数)挂钩实现中的命令行参数。
Is the database initialized before the command line is processed?
不,数据库是在解析命令行后很晚才初始化的。命令行参数在 pytest_configure
挂钩中变得可访问,并且数据库连接在 django_db_setup
夹具之前未初始化,因此在第一次调用 pytest_runtest_setup
挂钩之前不会。
示例,从您的 addopt
钩子扩展而来:
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
将使用 in-memory 数据库,运行 pytest --dbconnection=infile
将使用该文件(您可以使用 --reuse-db
重新运行以验证数据库文件是否已创建)。
我正在尝试通过从命令行传递的值来初始化 pytest 的数据库。我无法在不同的测试 setting.py 中指定值,也无法在 settings.py 的 TEST 选项中指定它;它只能通过命令行使用。
我在 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
来更改数据库。
这可能吗?在处理命令行之前是否初始化了数据库?我尝试了一些实验,看起来确实如此。有没有其他解决方法可以使它正常工作?
Is there any way I can access these values in conftest.py?
您可以访问所有装置(通过 request.config
)和(大多数)挂钩实现中的命令行参数。
Is the database initialized before the command line is processed?
不,数据库是在解析命令行后很晚才初始化的。命令行参数在 pytest_configure
挂钩中变得可访问,并且数据库连接在 django_db_setup
夹具之前未初始化,因此在第一次调用 pytest_runtest_setup
挂钩之前不会。
示例,从您的 addopt
钩子扩展而来:
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
将使用 in-memory 数据库,运行 pytest --dbconnection=infile
将使用该文件(您可以使用 --reuse-db
重新运行以验证数据库文件是否已创建)。