无参运行pytest触发pytest-json-report插件PluginValidationError报错
报错根因
执行无参数pytest命令时,pytest-json-report插件不会完成自身钩子的注册流程,pytest的插件管理核心pluggy扫描conftest.py发现pytest_json_modifyreport钩子实现,但找不到对应已注册的钩子规范,就会抛出插件校验错误。传入--json-report参数时插件会提前完成所有钩子注册,因此不会触发该问题。
可行解决方案(无需注释钩子函数)
最简便的处理方式是给钩子函数加上pytest内置的可选钩子标记,告知pluggy该钩子由可选依赖提供,依赖未加载时直接跳过校验即可。
只需要在自定义的pytest_json_modifyreport函数上添加@pytest.hookimpl(optionalhook=True)装饰器,示例代码如下:
import pytest @pytest.hookimpl(optionalhook=True) def pytest_json_modifyreport(json_report): # 保留原有的自定义JSON报告修改逻辑即可 pass
添加装饰器后的效果:
- 不带参数执行pytest时,pluggy会识别到这是可选钩子,不会抛出未知钩子的校验错误
- 带
--json-report参数执行时,钩子逻辑正常触发,原有修改报告的功能完全不受影响
如果不想使用装饰器,也可以在conftest中增加插件加载状态判断,仅当检测到pytest-json-report插件已激活时才注册对应钩子,示例逻辑如下:
import pytest def pytest_configure(config): # 检测pytest-json-report插件是否加载 if not config.pluginmanager.hasplugin("pytest_json_report"): return # 插件加载完成后再定义并注册钩子 def pytest_json_modifyreport(json_report): # 写入原有的自定义报告修改逻辑 pass config.pluginmanager.register(pytest_json_modifyreport)
优先选择第一种加装饰器的方案,代码改动量最小,逻辑清晰,不需要额外写动态注册逻辑。
内容的提问来源于stack exchange,提问作者Serhii Kushchenko
相关产品推荐
相关产品推荐

