如何在 运行 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
在使用 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