Почему pytest выдает ошибку «нераспознанный параметр», когда я пытаюсь создать настраиваемый параметр командной строки? - PullRequest
1 голос
/ 06 августа 2020

Я использую Python 3.8 и pytest 6.0.1. Как создать настраиваемый параметр командной строки для pytest? Я думал, что это так же просто, как добавить это в conftest.py ...

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

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

# pytest --option1=Y -c tests/my_test.py 
ERROR: usage: pytest [options] [file_or_dir] [file_or_dir] [...]
pytest: error: unrecognized arguments: --option1=Y

Какой правильный способ добавить настраиваемый параметр?

Изменить: Я попробовал данный ответ. Я включил некоторые другие вещи в свой файл tests / conftest.py на случай, если это причина того, что ответ не работает. Файл содержит

def pytest_generate_tests(metafunc):
    option1value = metafunc.config.getoption("--option1")
    print(f'Option1 Value = {option1value}')

def pytest_configure(config):
    use_docker = False
    try:
        use_docker = config.getoption("--docker-compose-remove-volumes")
    except:
        pass
    plugin_name = 'wait_for_docker' if use_docker else 'wait_for_server'
    if not config.pluginmanager.has_plugin(plugin_name):
        config.pluginmanager.import_plugin("tests.plugins.{}".format(plugin_name))

Но при запуске выводится

$ pytest -s --option1 tests/shared/model/test_crud_functions.py
ERROR: usage: pytest [options] [file_or_dir] [file_or_dir] [...]
pytest: error: unrecognized arguments: --option1
  inifile: /Users/davea/Documents/workspace/my_project/pytest.ini
  rootdir: /Users/davea/Documents/workspace/my_project

Ответы [ 2 ]

1 голос
/ 08 августа 2020

Как уже упоминалось в комментарии, action='store_const' делает вашу опцию флагом. Значение, которое вы получаете при чтении значения параметра, если оно указано в cli, является значением, указанным в const, т.е. True в вашем случае.

Попробуйте следующее: добавьте функцию ниже в conftest.py

def pytest_generate_tests(metafunc):
    option1value = metafunc.config.getoption("--option1")
    print(f'Option1 Value = {option1value}')
  1. pytest, вызываемый с опцией pytest -s --option1

    Результат будет иметь: Option1 Value = True

  2. pytest вызывается без опции pytest -s

    Результат будет иметь: Значение Option1 = None

action=store может даст вам желаемое поведение.

Решение :

# Change the action associated with your option to action='store'
def pytest_addoption(parser):
    parser.addoption('--option1', action='store')


def pytest_configure(config):
    x = config.getoption('option1')
    print(x)  # Any logic that uses option value

Вывод:

pytest -s --option1=Y -c=test.py
Y
============================================================================= test session starts ==============================================================================
platform darwin -- Python 3.8.5, pytest-6.0.1, py-1.9.0, pluggy-0.13.1

Подробности можно найти о доступных действиях и многом другом здесь: https://docs.python.org/3/library/argparse.html#action

0 голосов
/ 27 августа 2020

Думаю, здесь важен порядок.

Попробуйте pytest -c tests/my_test.py --option1=Y

...