如何在py.test中加载自定义插件

3 投票
2 回答
5093 浏览
提问于 2025-04-18 09:26

我在写一个自定义插件,用来收集py.test的结果,并把这些结果保存到一个rst格式的文件里。最后,我想把这个文件放到Sphinx文档中。

我把插件写在了当前工作目录下的myplugin.py模块里。然后我调用了

py.test -p myplugin ../mytool/test

结果出现了一个错误:ImportError: No module named myplugin

我还尝试过用这样的方式调用它:

py.test -p .myplugin ../mytool/test

这是相对导入的方式,但也没有成功。

我该如何正确使用这个插件呢?

文档里提供了关于插件检测的以下信息:

工具启动时的插件发现顺序 pytest在启动时以以下方式加载插件模块:

  • 首先加载所有内置插件

  • 然后加载通过setuptools入口点注册的所有插件。

  • 接着预先扫描命令行中的-p名称选项,并在实际解析命令行之前加载指定的插件。

  • 然后加载所有的conftest.py文件,这些文件是根据命令行调用推断出来的:

如果没有指定测试路径,就使用当前目录作为测试路径(如果存在),加载conftest.py和相对于第一个测试路径目录部分的test*/conftest.py。请注意,pytest在工具启动时不会在更深层的子目录中找到conftest.py文件。通常,把conftest.py文件放在顶层测试或项目根目录是个好主意。

  • 最后递归加载所有在conftest.py文件中由pytest_plugins变量指定的插件。

2 个回答

0

如果你想从当前目录加载一个插件,你也可以直接用 python -m 来调用 pytest

python -m pytest -p myplugin

这样你就不需要特别设置 PYTHONPATH 了。从官方文档来看:

pytestpython -m pytest 的区别

python -m pytest [...] 来运行 pytest,而不是直接用 pytest [...],这两者的效果几乎是一样的,唯一的不同是前者会把当前目录添加到 `sys.path` 中。更多信息可以查看通过 python -m pytest 调用 pytest 的方法。

2

如果这个插件无法被导入,那是因为它不在 sys.path 这个路径里。你可以试着通过 PYTHONPATH 变量来手动添加它:

PYTHONPATH=/path/to/dir/of/myplugin py.test -p myplugin ../mytool/test

撰写回答