如何在 运行 pytest 测试之前安装 python 插件?

How to install python plugin before running pytest tests?

在使用 pytest 开始测试之前,我需要安装一个 python 插件,它是一个简单的 python 文件。我在setup.py中使用了entry_points。我的问题有点复杂,所以让我们通过一个例子来解决这个问题,我们稍后再回来讨论这个问题。

有两个包-一个是core,另一个是mypackage

核心提供了添加组名为“my.plugin”的插件的功能。

核心包逻辑

from importlib_metadata import entry_points 
def plugin_method(some_data):
    plugins = entry_points()['my.plugin']
    loaded_plugins = []
    for p in plugins:
       loaded_plugins.apend(p.load())
    #Does some processing on the data and decides which method to call from plugin
    #call plugin method
return result

我的包逻辑

setup.py

setup(
...
entry_points={'my.plugin': 'plugin1= plugin1.logic'}
...
)

logic.py

def method1(method_data):
    print('method1 called')
    return 1

def method2(method_data):
    print('method1 called')
    return 2

main.py

def method_uses_plugin()
    # create data
    plugin_method(data)

插件运行良好。 :)


问题

我已经为method_uses_plugin方法写了一个测试用例。如果我在我的机器上安装了 pypackage 它工作正常但是如果安装没有完成它会失败(在 jenkins 管道中)

我们通常不会将包安装到运行个测试用例中,因为测试用例应该直接使用源代码。

我们可能需要用 pytest 做一些事情来在 entry_points 中注册插件。我尝试了很多链接,但没有任何效果。

我的用例有点复杂,但可以找到类似的问题

有两个用例运行在实际源代码上进行测试。

在您的本地计算机中

如果您想在工作时测试源代码,只需使用以下命令以可编辑模式安装包即可:

pip install -e .

手册页中的 -e 文档:

-e,--editable <path/url>
     Install a project in editable mode (i.e.  setuptools "develop mode") from a local project path or a VCS url.

这将 link 包到代码的 . 位置,这意味着对源代码所做的任何更改都将反映在包中。

在持续集成中 (CI)

由于您的 CI 运行 正在 docker 容器上,您可以简单地复制其中的源代码,使用 pip install . 安装它,最后 运行 pytest.

如果所有其他方法都失败了,您可以尝试将您的代码转换为可执行文件,并使用批处理命令 运行 pip install 根据需要安装任意数量的包,然后 运行 您的程序。我相信在 Jenkins 中,您可以 运行 作为管理员批处理文件。

Invoke pip install from batch file

Run Batch file as an administrator in Jenkins