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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 09:25:19