如何在顶级conftest之外添加pytest选项?

时间:2018-07-12 18:07:25

标签: python testing pytest

我有一个项目,它定义了测试支持模块,包括像这样的包子目录中的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,我不想要求仅安装所有这些来运行基本测试。

还有另一种方法可以完成此操作吗?

1 个答案:

答案 0 :(得分:1)

如上所述,自Pytest 3.6.2起,必须添加选项“由于pytest在启动过程中如何发现插件,因此只能在位于测试根目录的插件或conftest.py文件中。”