Рассмотрим следующее приспособление
@pytest.fixture(params=['current', 'legacy'])
def baseline(request):
return request.param
Интересно, есть ли способ запустить pytest, чтобы он переопределял список параметров fixture со значениями, указанными в командной строке, то есть:
pytest --baseline legacy tests/
Вышеизложенное должно эффективно приводить к параметрам = ['legacy'].
Пойдите с динамической параметризацией через 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