GOOGLE ADS

суббота, 30 апреля 2022 г.

Способ добавить параметры pytest вне conftest верхнего уровня?

У меня есть проект, который определяет модули поддержки тестирования, включая плагины 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 обнаруживает плагины во время запуска».

Комментариев нет:

Отправить комментарий

Laravel Datatable addColumn returns ID of one record only

Я пытаюсь использовать Yajra Datatable для интеграции DataTable на свой веб-сайт. Я смог отобразить таблицу, но столкнулся с проблемой. В по...