pytest-xdist 安装错误会导致 importerror,应使用 pip install pytest-xdist 并验证;并行测试变慢或卡住多因资源竞争,建议从 -n 2 开始调优,禁用共享资源,合理配置分发策略与随机种子,ci 中需调高文件描述符限制。

pytest-xdist 启动就报 ImportError: No module named 'xdist'
这是没装对包,pytest-xdist 和 xdist 是两个东西。官方包名是 pytest-xdist,装错成 xdist 就会找不到模块。
实操建议:
- 用
pip install pytest-xdist,别用pip install xdist - 装完检查:运行
pip show pytest-xdist,确认输出里有Name: pytest-xdist - 如果项目用了
pyproject.toml,确保dependencies或[build-system]里写的是pytest-xdist
用 -n auto 分发后,测试反而变慢甚至卡住
-n auto 会按 CPU 核心数起 worker,但不是所有测试都适合并行——尤其当测试共享文件、数据库连接或全局状态时,竞争会拖垮性能。
实操建议:
- 先用
-n 2手动指定少量 worker,观察是否稳定;再逐步加到-n 4或-n $(nproc) - 禁用共享资源:避免多个 worker 同时读写同一
tmpdir、同一 SQLite 文件或同一日志路径 - 用
--dist=loadgroup替代默认的load,让同个test_*函数尽量进同一个 worker,减少 fixture 初始化开销
测试里用了 time.sleep() 或随机种子,结果每次运行不一致
pytest-xdist 默认把测试打散分发,不同 worker 的执行顺序、时间窗口、系统时钟偏移都不同。sleep 不等于同步,random.seed(42) 在每个 worker 里都得重设,否则各跑各的随机数。
实操建议:
- 绝对不要靠
time.sleep()等待异步动作完成;改用pytest-timeout+ 显式轮询 - 在 conftest.py 里用
pytest_configure钩子为每个 worker 单独初始化随机种子:def pytest_configure(config): import random random.seed(hash(config.workerinput.get("workerid", "master"))) - 涉及时间断言(比如 “生成的 timestamp 应该在当前 5 秒内”),用
freezegun冻结时间,而不是依赖系统时钟
CI 环境里 pytest -n 4 报 OSError: [Errno 24] Too many open files
每个 worker 进程都会打开自己的日志句柄、临时目录、数据库连接池等,默认 ulimit 常常不够用,尤其在 Docker 容器里更明显。
实操建议:
- CI 脚本开头加
ulimit -n 8192(或更高),Docker 则在docker run加--ulimit nofile=8192:8192 - 显式关闭测试中打开的资源:用
with管理文件/数据库连接,fixture 结束时调用.close()或.shutdown() - 避免在
conftest.py顶层 import 大量模块或初始化全局 client,它们会在每个 worker 里重复加载
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











