You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pytest-xdist远程模块含pytest_collection_modifyitems抛AssertionError

问题产生原因

xdist分布式执行的核心逻辑要求主节点与所有worker节点的用例收集结果必须完全一致,你遇到的报错本质是worker节点收到主节点分发的用例后,找不到对应用例、或执行用例前就发生崩溃,返回了crashitem标记触发了主节点的断言校验。
结合你提到的移除pytest_collection_modifyitems后恢复正常,具体触发原因可以锁定为以下两点:

  • 钩子执行范围不一致:你将pytest_collection_modifyitems写在了仅worker节点会加载的远程脚本中,主节点收集用例时不会执行该钩子逻辑,worker节点收集时会执行。如果该钩子修改了用例列表(增删用例、调整顺序、修改nodeid属性),就会导致主节点存储的用例标识和worker节点实际可执行的用例标识不匹配,worker找不到主节点分发的用例直接崩溃。
  • 钩子逻辑修改了用例的可执行性:如果你的pytest_collection_modifyitems逻辑中修改了用例对象的必要属性、绑定了不可序列化的对象、或修改了用例执行依赖的上下文,也会导致worker节点在尝试执行用例时提前崩溃。
解决方案

你可以根据自己的业务逻辑选择对应修复方案:

  1. 如果修改用例的逻辑只需要在主节点执行:
    在pytest_collection_modifyitems开头添加worker节点判断,worker节点直接跳过修改逻辑,保证两边收集结果一致:
def pytest_collection_modifyitems(config, items):
    # xdist worker节点存在workerinput属性,直接跳过修改
    if hasattr(config, "workerinput"):
        return
    # 此处保留你原有的修改逻辑
    ...
  1. 如果修改逻辑需要同时作用于主节点和worker节点:
    不要将该钩子写在仅worker加载的远程脚本中,而是将其放到全局的conftest.py中,保证主节点和所有worker节点都会执行相同的修改逻辑,且修改时不能增删用例、不能修改用例的nodeid属性,保证两边收集的用例标识完全匹配。
  2. 若需要排查具体的worker侧错误:
    执行测试时添加参数--log-cli-level=DEBUG 或配置worker输出透传,即可打印worker节点的具体报错信息,进一步定位钩子逻辑的问题。

内容的提问来源于stack exchange,提问作者Akhilesh R

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.16 03:15:04