如何在pytest-xdist中为Worker分配固定COM端口号
给pytest-xdist Worker分配固定COM端口的实现方案
核心思路
让每个worker在启动阶段就绑定专属的COM端口,且端口在整个测试周期内保持固定,核心是借助pytest-xdist的钩子函数完成端口的一对一分配。
具体实现步骤
1. 编写端口分配配置(conftest.py)
在项目根目录创建conftest.py文件,通过pytest钩子实现端口分配逻辑:
import os def pytest_configure(config): # 从环境变量读取端口列表,也可直接硬编码端口 ports_str = os.getenv("COM_PORTS", "") config._com_ports = ports_str.split(",") if ports_str else [] # 校验worker数量与端口数量是否匹配 num_workers = int(config.getoption("-n", default=1)) if len(config._com_ports) != num_workers: raise ValueError(f"COM端口数量({len(config._com_ports)})必须和worker数量({num_workers})一致") config._port_index = 0 def pytest_configure_node(node): # 给每个启动的worker分配对应索引的端口 node.config._com_port = node.config._com_ports[node.config._port_index] node.config._port_index += 1
2. 在测试用例中调用专属端口
测试用例里直接通过request.config获取当前worker绑定的固定端口:
def test_device_interaction(request): com_port = request.config._com_port # 这里编写你的设备交互逻辑,比如打开串口、发送测试指令等 print(f"Worker {request.config.worker_id} 正在使用端口 {com_port} 执行测试") # 示例:import serial; ser = serial.Serial(com_port, 9600)
3. 启动并行测试
先设置环境变量指定所有可用COM端口,再启动对应数量的worker:
# Windows系统 set COM_PORTS=COM1,COM2,COM3 pytest -n 3 # Linux/macOS系统 export COM_PORTS=/dev/ttyUSB0,/dev/ttyUSB1,/dev/ttyUSB2 pytest -n 3
关键说明
- 端口在worker启动时完成分配,整个worker生命周期内不会变更,所有分配给该worker的测试用例都会复用同一个端口
- 必须保证worker数量和端口数量严格一致,避免出现索引越界问题
- 用环境变量传递端口比硬编码更灵活,适配不同测试环境的硬件配置
内容的提问来源于stack exchange,提问作者Filip Kunc
相关产品推荐
相关产品推荐

