pytest源码_Pytest的魂Pluggy(初探篇)

pytest源码_Pytest的魂Pluggy(初探篇)

Pluggy是啥?从官网的解释给出,Pluggy让用户能够通过为host程序安装插件来扩展或修改该程序的行为。而且它是pytest插件管理和钩子函数调用的核心,pytest本身就是由一堆插件组成的,这些插件follow一些协议的规定会依次执行。

最近学习Pytest, 感觉pytest最有价值的地方就是它的hook功能,对于想要围绕pytest扩展自己的测试系统,这里给予强大的支持,而且扩展功能和主测试程序是模块分离低藕联的,这让扩展变得简单和让主程序拥有无感知的后门程序。所以想认真学习一下pluggy,也为研究pytest插件和源码打好基础。

围绕pluggy构建插件系统,pluggy官网给整个插件系统定义了四个角色。

host程序:主程序提供了可扩展性,可扩展功能通过指定钩子函数并调用它们的实现作为主程序执行的一部分。

插件:实现了特定的钩子函数逻辑,并在host程序执行时在特定条件下被调用。

pluggy:host程序和插件的桥梁,使用pluggy让插件植入主程序。

用户:安装主程序并希望用插件扩展其功能的人。在最简单的情况下,他们将插件安装在与主程序相同的环境中,当主程序运行时,这种魔力就会发生。根据插件的不同,他们可能还需要做其他事情。例如,他们可能不得不用一个附加的命令行参数来选择调用哪个插件。

看一个例子

import pluggyhook_spec = pluggy.HookspecMarker("test")hook_impl = pluggy.HookimplMarker("test")class HookSpec:    @hook_spec    def test_hook(self):        passclass Plugin1:    @hook_impl    def test_hook(self):        print("inside Plugin1")class Plugin2:    @hook_impl    def test_hook(self):        print("inside Plugin2")pm = pluggy.PluginManager("test")pm.add_hookspecs(HookSpec)pm.register(Plugin1())pm.register(Plugin2())pm.hook.test_hook()

运行结果

inside Plugin2inside Plugin1
  • HookspecMarker,修饰器帮助类,用于生成一个修饰器去标记函数作为钩子函数,源码里重写了__call__.

  • HookimplMarker,修饰器帮助类,用于生成一个修饰器去标记函数作为钩子函数的具体实现,重写了__call__

  • PluginManager,核心插件管理类,用于注册hook与管理hook的调用。
  • 整个项目需要一个唯一的project名字,这里我用了test.

整个代码逻辑是先创建了一个PluginManager对象,并在该对象上注册HookSpec,然后注册了Plugin1对象和Plugin2对象,它们都实现了test_hook,最后通过PluginManager.hook调用test_hook方法。

pytest源码_Pytest的魂Pluggy(初探篇)

听说关注我们的人 都升职加薪啦

你要做的

无非是

长按关注

pytest源码_Pytest的魂Pluggy(初探篇)

Original: https://blog.csdn.net/weixin_29883023/article/details/112415774
Author: 七十二便
Title: pytest源码_Pytest的魂Pluggy(初探篇)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/775787/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球