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节点在尝试执行用例时提前崩溃。
解决方案
你可以根据自己的业务逻辑选择对应修复方案:
- 如果修改用例的逻辑只需要在主节点执行:
在pytest_collection_modifyitems开头添加worker节点判断,worker节点直接跳过修改逻辑,保证两边收集结果一致:
def pytest_collection_modifyitems(config, items): # xdist worker节点存在workerinput属性,直接跳过修改 if hasattr(config, "workerinput"): return # 此处保留你原有的修改逻辑 ...
- 如果修改逻辑需要同时作用于主节点和worker节点:
不要将该钩子写在仅worker加载的远程脚本中,而是将其放到全局的conftest.py中,保证主节点和所有worker节点都会执行相同的修改逻辑,且修改时不能增删用例、不能修改用例的nodeid属性,保证两边收集的用例标识完全匹配。 - 若需要排查具体的worker侧错误:
执行测试时添加参数--log-cli-level=DEBUG或配置worker输出透传,即可打印worker节点的具体报错信息,进一步定位钩子逻辑的问题。
内容的提问来源于stack exchange,提问作者Akhilesh R
相关产品推荐
相关产品推荐

