pytest-xdist需安装后显式加-n参数才启用并发:pip install pytest-xdist,本地双核用pytest -n 2,推荐自动适配用pytest -n auto;默认按test函数粒度分发,不加-n仍为单进程执行。

pytest-xdist 安装和基础并发启动方式
直接装完就能跑并发,但默认不生效——必须显式加 -n 参数。不加就还是单进程顺序执行。
- 安装:
pip install pytest-xdist - 本地双核跑 2 个进程:
pytest -n 2 - 自动按 CPU 核数分配(推荐):
pytest -n auto - 指定 worker 数量时,
-n 0是非法值,会报错ValueError: n must be > 0
测试函数被拆分到不同进程的规则
pytest-xdist 默认按「test item」粒度分发,也就是每个 def test_* 函数单独调度,不是按文件、类或模块切分。
- 同一测试文件里的多个
test_*函数,大概率被分到不同 worker,除非数量少于 worker 数 - 如果某个 test 函数里用了
time.sleep(5)或 I/O 阻塞,它会独占一个 worker,拖慢整体进度 - 想强制让某组测试在同一个 worker 执行(比如共享 fixture 状态),得用
--dist=loadgroup+@pytest.mark.xdist_group(name="api")
共享资源冲突:临时目录、数据库、端口怎么破
并发下 tmpdir 或 tmp_path 虽然各自隔离,但像 SQLite 文件路径、HTTP 端口、Redis 连接这类全局资源极易撞车。
创建 Flask + Vue.js 全栈项目,采用单端口架构、uv 依赖管理、结构化日志和生产级前端设计。当用户要求以下操作时触发:创建新的 Flask+Vue 项目、搭建 Web 应用、构建全栈 Python+Vue 应用、初始化 Flask Web 项目、设置单端口 Flask 前后端项目。触发词:新建项目、创建项目、搭建项目、Flask项目、Vue项目。
- 避免硬编码端口:用
socket.bind(("", 0))让系统分配空闲端口,再用getsockname()拿到实际值 - SQLite 不要复用同一文件路径;每个 worker 应生成唯一 DB 路径,例如基于
os.getpid()或worker_id(需通过pytest_configure注入) - fixture 中初始化资源时,加锁或用
xdist_info判断当前是否主进程(config.workerinput不存在即为主)
调试失败测试时为什么看不到完整 traceback
默认情况下,worker 进程崩溃只在主进程输出简略错误,比如 Worker crashed while running ...,根本不知道哪行抛了异常。
立即学习“Python免费学习笔记(深入)”;
- 加
--tb=short或--tb=long可恢复完整 traceback,但注意--tb=auto在 xdist 下仍可能截断 - 更可靠的是加
--capture=no(或-s),让 print/log 直接输出,便于定位卡点 - 如果测试依赖环境变量(如
ENV=staging),必须用--tx "popen//env:ENV=staging"显式透传,否则 worker 里读不到

















