带有来自命令行和固定装置的数据库详细信息的pytest

时间:2019-06-27 21:57:58

标签: python django pytest pytest-django

我试图通过从命令行传递的值初始化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来更改数据库。

这可能吗?在处理命令行之前是否已初始化数据库?我尝试了一些实验,看起来确实如此。还有其他解决方法可以使其正常工作吗?

1 个答案:

答案 0 :(得分:1)

  

我可以通过conftest.py访问这些值吗?

您可以(通过request.config和(大多数)钩子impls访问所有灯具中的命令行参数。

  

在处理命令行之前数据库是否已初始化?

否,在解析命令行后的很长时间之后才初始化数据库。在pytest_configure挂钩中可以访问命令行args,并且不会在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将使用内存中的数据库,运行pytest --dbconnection=infile将使用该文件(您可以使用--reuse-db重新运行以验证是否创建了数据库文件)。