Windows10下使用behave-parallel运行并行测试报错求助
解决Windows 10 + Python 2.7下behave-parallel运行报错的问题
首先可以明确:这不是你的操作失误,核心是Windows 10 + Python 2.7与behave-parallel的兼容性问题。下面来拆解报错原因和对应的解决方案:
报错根源分析
你看到的两个错误都是Python 2.7在Windows环境下多进程机制的固有问题导致的:
TypeError: __new__() takes exactly 3 arguments (2 given):这是进程间对象序列化(pickle)失败的问题。Windows的多进程不支持fork,必须通过序列化把对象传递给子进程,而Python 2.7的pickle模块对复杂对象的支持有限,behave-parallel内部的某些对象无法被正确反序列化。IOError: [Errno 22] Invalid argument:这是子进程启动时的管道通信错误,属于Python 2.7的multiprocessing模块在Windows平台的兼容性bug。
可行解决方案
1. 升级到Python 3.x(最彻底的解决办法)
Python 3.x的multiprocessing模块在Windows上的实现完全重写过,稳定性和兼容性远优于Python 2.7,而且behave和behave-parallel对Python 3的支持非常完善。操作步骤:
- 删掉当前基于Python 2.7的虚拟环境
- 创建一个Python 3.7及以上版本的虚拟环境(推荐3.8~3.11,兼容性最佳)
- 重新安装
behave和behave-parallel - 再次执行
behave --processes 5 --parallel-element feature,并行测试应该能正常运行。
2. 若必须保留Python 2.7,尝试以下调整
- 减少worker数量:启动5个worker在Python 2.7+Windows下可能超出了进程通信的资源限制,先试试
behave --processes 2 --parallel-element feature,看是否能正常运行。 - 检查测试代码中的可序列化对象:确保你的steps定义、environment.py里没有使用无法被pickle序列化的元素(比如lambda函数、自定义类的非标准实例),这些元素会导致进程间传递失败。
- 添加多进程初始化代码:在项目的
environment.py开头添加以下代码,尝试修复进程启动逻辑:
(注:这个方法不一定能完全解决pickle的问题,但可以缓解部分进程启动错误)import multiprocessing if __name__ == '__main__': multiprocessing.freeze_support()
内容的提问来源于stack exchange,提问作者Den Silver
相关产品推荐
相关产品推荐

