У меня есть проект, который определяет модули поддержки тестирования, включая плагины py.test в подкаталоге пакета, например:
bokeh/_testing
├── __init__.py
├── plugins
│ ├── __init__.py
│ ├── bokeh_server.py
│ ├── examples_report.jinja
│ ├── examples_report.py
│ ├── file_server.py
│ ├── implicit_mark.py
│ ├── integration_tests.py
│ ├── jupyter_notebook.py
│ ├── log_file.py
│ └── pandas.py
└── util
├── __init__.py
├── api.py
├── examples.py
├── filesystem.py
├── git.py
└── travis.py
Некоторым плагинам необходимо определить новые параметры с помощью parser.addoption
. Я хотел бы, чтобы эти вызовы выполнялись внутри соответствующих модулей плагинов. Однако, если я это сделаю и включу эти плагины в тестовый файл, например,
# test_examples.py
pytest_plugins = (
"bokeh.testing.plugins.bokeh_server",
"bokeh.testing.plugins.examples_report",
)
# pytest.mark.examples test code here
Затем pytest жалуется, что любые пользовательские параметры командной строки не определены:
(base) ❯ py.test -s -v -m examples --diff-ref FETCH_HEAD --report-path=examples.html
usage: py.test [options] [file_or_dir] [file_or_dir] [...]
py.test: error: unrecognized arguments: --diff-ref --report-path=examples.html
inifile: /Users/bryanv/work/bokeh/setup.cfg
rootdir: /Users/bryanv/work/bokeh
Единственный способ, который я нашел для этого, - собрать ВСЕ пользовательские параметры в один pytest_addoption
на верхнем уровне conftest.py
:
# conftest.py
pytest_plugins = (
"bokeh.testing.plugins.implicit_mark",
"bokeh.testing.plugins.pandas",
)
# Unfortunately these seem to all need to be centrally defined at the top level
def pytest_addoption(parser):
parser.addoption(
"--upload", dest="upload", action="store_true", default=False, help="..."
)
#... ALL other addoptions calls for all plugins here...
Как я уже сказал, это работает, но очень негибко с точки зрения организации кода. Было бы предпочтительнее иметь способ для опций examples.py
плагина в модуле examples.py
с кодом, к которому он относится.
Другая возможность, по-видимому, заключалась бы в том, чтобы установить все плагины на верхнем уровне conftest.py
, но некоторые из плагинов очень тяжелые, например, зависят от Selenium, и я не хотел бы требовать, чтобы все они были установлены только для запуска основных тестов.
Есть ли другой способ сделать это, и если да, то как?
Решение проблемы
Как отмечалось выше, для Pytest 3.6.2
параметры должны быть добавлены «только в файлы плагинов или conftest.py, расположенные в корневом каталоге тестов, из-за того, как pytest обнаруживает плагины во время запуска».
Комментариев нет:
Отправить комментарий