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

1

Рассмотрим следующее приспособление

@pytest.fixture(params=['current', 'legacy'])
def baseline(request):
    return request.param

Интересно, есть ли способ запустить pytest, чтобы он переопределял список параметров fixture со значениями, указанными в командной строке, то есть:

pytest --baseline legacy tests/

Вышеизложенное должно эффективно приводить к параметрам = ['legacy'].

Теги:
testing
pytest

1 ответ

1
Лучший ответ

Пойдите с динамической параметризацией через Metafunc.parametrize:

# conftest.py
import pytest


@pytest.fixture
def baseline(request):
    return request.param


def pytest_addoption(parser):
    parser.addoption('--baseline', action='append', default=[],
        help='baseline (one or more possible)')


def pytest_generate_tests(metafunc):
    default_opts = ['current', 'legacy']
    baseline_opts = metafunc.config.getoption('baseline') or default_opts
    if 'baseline' in metafunc.fixturenames:
        metafunc.parametrize('baseline', baseline_opts, indirect=True)

Использование без параметров дает два теста по умолчанию:

$ pytest test_spam.py -sv
...
test_spam.py::test_eggs[current] PASSED
test_spam.py::test_eggs[legacy] PASSED

Передача --baseline перезаписывает значения по умолчанию:

$ pytest test_spam.py -sv --baseline=foo --baseline=bar --baseline=baz
...
test_spam.py::test_eggs[foo] PASSED
test_spam.py::test_eggs[bar] PASSED
test_spam.py::test_eggs[baz] PASSED

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

def pytest_addoption(parser):
    parser.addoption('--baseline', action='append', default=['current', 'legacy'],
        help='baseline (one or more possible)')


def pytest_generate_tests(metafunc):
    baseline_opts = metafunc.config.getoption('baseline')
    if 'baseline' in metafunc.fixturenames and baseline_opts:
        metafunc.parametrize('baseline', baseline_opts, indirect=True)

Теперь вызов вызова всегда будет включать current и legacy параметры:

$ pytest test_spam.py -sv --baseline=foo --baseline=bar --baseline=baz
...
test_spam.py::test_eggs[current] PASSED
test_spam.py::test_eggs[legacy] PASSED
test_spam.py::test_eggs[foo] PASSED
test_spam.py::test_eggs[bar] PASSED
test_spam.py::test_eggs[baz] PASSED
  • 0
    Я ценю ваш тщательный ответ и правильно идиоматический код. Весьма признателен.
  • 0
    Рад, что смог помочь!
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню