我有一个项目,它定义了测试支持模块,包括像这样的包子目录中的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
中收集 ALL 自定义选项:
# 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
插件提供选项,以使其与相关的代码 in examples.py
模块。
另一种可能性可能是将所有插件都放入顶级conftest.py
中,但是其中一些插件非常重,例如取决于Selenium,我不想要求仅安装所有这些来运行基本测试。
还有另一种方法可以完成此操作吗?
答案 0 :(得分:1)
如上所述,自Pytest 3.6.2
起,必须添加选项“由于pytest在启动过程中如何发现插件,因此只能在位于测试根目录的插件或conftest.py文件中。”