Как активировать прибор PyTest из командной строки? - PullRequest
2 голосов
/ 05 августа 2020

Я использую Python3 .8 и pytest. Как я могу активировать прибор для моего сеанса на основе некоторой спецификации командной строки? Прямо сейчас у меня есть файл tests / conftest.py, который включает

@pytest.fixture(name="fixture1", scope="session")
def fixture1():
    ...

@pytest.fixture(name="fixture2", scope="session")
def fixture2():
    ...

Но я хочу, чтобы в мой сеанс были включены только определенные приборы, и я хочу иметь возможность указать это либо в файле pytest.ini, либо через аргументы командной строки я передаю pytest. Как мне это сделать?

Изменить: Это мой вариант использования ...

Если опция командной строки включена, я бы хотел зависеть от одного прибор

@pytest.fixture(name="az_sql_db_inst")
def az_db_connection_fixture(az_sql_creds, wait_for_sql_server)

но если командная строка не включена, я бы хотел зависеть от другого прибора ...

@pytest.fixture(name="az_sql_db_inst")
def az_db_connection_fixture(az_sql_creds, wait_for_docker_sql_server)

1 Ответ

2 голосов
/ 05 августа 2020

Вы можете добавить флаги командной строки, которые можно использовать для включения ваших фикстур:

conftest.py

def pytest_addoption(parser):
    parser.addoption('--option2', action='store_const', const=True)
    parser.addoption('--option2', action='store_const', const=True)

Затем вы должны проверить эти аргументы в вашем приспособлении:

@pytest.fixture(name="fixture1", scope="session", autouse=True)
def fixture1(request):
   # only use with option1 command line argument
   if request.config.getoption("--option1"):
       ...
    
@pytest.fixture(name="fixture2", scope="session", autouse=True)
def fixture2(request):
   # only use with option2 command line argument
   if request.config.getoption("--option2"):
       ...

@pytest.fixture(name="fixture3", scope="session", autouse=True)
def fixture3(request):
   # only use if option1 command line argument is not provided
   if not request.config.getoption("--option1"):
       ...

Здесь я использовал autouse=True, так как я ожидаю, что приспособления выполняют другой код настройки, ваше использование, конечно, может отличаться.

Теперь вы можете позвонить:

  • pytest -> приспособление не будет применяться
  • pytest --option1 -> будет применено приспособление1
  • pytest --option1 --option2 -> будут применены оба приспособления

Вы также можете добавить эти аргументы в свой pytest.ini:

[pytest]
# always apply fixture2
addopts = --option2

EDIT: Что касается следующего вопроса о унаследованном приспособлении, вы можете сделать что-то вроде этого:

@pytest.fixture
def wait_for_sql_server(request):
   if request.config.getoption("--my_option"):
       ...

@pytest.fixture
def wait_for_docker(request):
   if not request.config.getoption("--my_option"):
       ...

@pytest.fixture(name="az_sql_db_inst")
def az_db_connection_fixture(
    az_sql_creds, wait_for_sql_server, wait_for_docker):
    ...

EDIT2: Если вы не можете самостоятельно написать или адаптировать базовые приборы (wait_for_ в части EDIT вопроса), вы можете go немного другим способом.

Вы можете написать отдельные реализации своей базы fixture в отдельных плагинах и загрузите необходимый плагин в зависимости от конфигурации:

plugin_ docker .py

@pytest.fixture
def wait_for_service(wait_for_docker):
    yield

plugin_server.py

@pytest.fixture
def wait_for_service(wait_for_sql_server):
    yield

conftest.py

def pytest_addoption(parser):
    parser.addoption('--docker', action='store_const', const=True)

def pytest_configure(config):    
    use_docker = config.getoption("--docker")
    plugin_name = 'plugin_docker' if use_docker else 'plugin_server'
    if not config.pluginmanager.has_plugin(plugin_name):
        config.pluginmanager.import_plugin(plugin_name)

@pytest.fixture(name="az_sql_db_inst")
def az_db_connection_fixture(az_sql_creds, wait_for_service):
    ...    

Светильники wait_for_service - это просто оболочка вокруг самих светильников, но таким образом вы можете получить то же приспособление в обоих сценариях ios.

...