目录
运行插件 pm.hook.myhook(arg1=1, arg2=2):本质就是调用对象的call方法
前言:
pytest 是一个广泛使用的自动化测试框架,它可以帮助我们更轻松地执行测试,并使测试结果更加可靠。Pluggy 是 pytest 的一个核心库,它提供了一些有用的工具,可以帮助我们更轻松地执行测试。
代码案例
import pluggy
# HookspecMarker 和 HookimplMarker 实质上是一个装饰器带参数的装饰器类,作用是给函数增加额外的属性设置
hookspec = pluggy.HookspecMarker("myproject")
hookimpl = pluggy.HookimplMarker("myproject")
'''
HookspeckMarker:
传入firstresult=True时,获取第一个plugin执行结果后就停止继续执行 @hookspec(firstresult=True)
historic - 表示这个 hook 是需要保存call history 的,当有新的 plugin 注册的时候,需要回放历史
hookimpl:
当传入tryfirst=True时,表示这个类的hook函数会优先执行,其他的仍然按照后进先出的顺序执行
当传入trylast=True,表示当前插件的hook函数会尽可能晚的执行,其他的仍然按照后进先出的顺序执行
当传入hookwrapper=True时,需要在这个plugin中实现一个yield,plugin先执行yield之前的代码,
然后去执行其他的pluggin,然后再回来执行yield之后的代码,同时通过yield可以获取到其他插件执行的结果
'''
# 定义自己的Spec,这里可以理解为定义接口类
class MySpec:
# hookspec 是一个装饰类中的方法的装饰器,为此方法增额外的属性设置,这里myhook可以理解为定义了一个接口
# 会给当前方法添加属性 键为 {self.project_name + "_spec"} 值是装饰器传入的参数
@hookspec
def myhook(self, arg1, arg2):
pass
# 定义了一个插件
class Plugin_1:
# 插件中实现了上面定义的接口,同样这个实现接口的方法用 hookimpl装饰器装饰,功能是返回两个参数的和
@hookimpl
def myhook(self, arg1, arg2):
print("inside Plugin_1.myhook()")
return arg1 + arg2
# 定义第二个插件
class Plugin_2:
# 插件中实现了上面定义的接口,同样这个实现接口的方法用 hookimpl装饰器装饰,功能是返回两个参数的差
@hookimpl(hookwrapper=True)
def myhook(self, arg1, arg2):
out = yield
print("inside Plugin_2.myhook()")
return arg1 -