使用pytest-xdist时pytest_configuration钩子重复执行的解决方案咨询
解决pytest-xdist下
pytest_configure钩子重复执行的问题 这是因为pytest-xdist运行时会启动一个主控制节点和n个工作节点,默认情况下pytest_configure钩子会在所有节点(主节点+每个工作节点)上触发,所以总共执行n+1次。要让配置操作只执行一次,我们只需要让代码仅在主节点上运行即可。
解决方案:添加主节点判断
修改你的pytest_configure钩子,增加判断当前是否为主节点的逻辑,工作节点直接跳过配置操作:
def pytest_configure(config): # 工作节点会带有workerinput属性,主节点没有,以此区分 if hasattr(config, 'workerinput'): return option = config.getoption("--option_to_run_stuff") if option == "1": do_stuff()
另一种判断方式(基于xdist插件API)
如果你想更明确地依赖xdist的API,也可以通过插件管理器获取xdist插件,直接判断是否为主节点:
def pytest_configure(config): xdist_plugin = config.pluginmanager.getplugin("xdist") # 如果启用了xdist且当前不是主节点,跳过 if xdist_plugin and not xdist_plugin.is_master(config): return option = config.getoption("--option_to_run_stuff") if option == "1": do_stuff()
原理说明
- 主节点负责调度测试任务,不需要执行测试用例,所以适合在这里执行全局配置操作。
- 工作节点只负责执行分配到的测试用例,不需要重复执行全局配置,通过判断
workerinput属性(或xdist的is_master方法)可以精准区分节点类型。
这样修改后,不管你启动多少个并行工作节点,do_stuff()只会在主节点执行一次,完美解决重复执行的问题。
内容的提问来源于stack exchange,提问作者YuMa
相关产品推荐
相关产品推荐

