vscode不支持pytest-xdist原生快捷键集成,必须在settings.json中配置python.testing.pytestargs为["-n","auto"]等参数并点击侧边栏↻刷新,调试时自动禁用-n且断点失效。

VSCode 本身不支持 pytest 分布式测试(如 pytest-xdist)的原生快捷键集成——所有分布式能力都来自命令行参数,VSCode 的“Run Test”/“Debug Test”按钮和快捷键(如 Ctrl+Shift+P → “Test: Run Selected Test”)默认只触发单进程 pytest 调用,完全忽略 -n、--dist 等 xdist 参数。想真正并发跑测试,必须绕过图形界面,靠配置驱动。
pytest-xdist 参数必须写进 python.testing.pytestArgs
VSCode 测试侧边栏的运行逻辑只认 python.testing.pytestArgs 数组里的参数,其他地方(比如 launch.json 或终端历史)写的 -n auto 都无效。
- 正确写法(在
.vscode/settings.json中):"python.testing.pytestArgs": ["-n", "auto", "--dist=loadgroup"]
- 错误写法:
["tests/", "-n auto"]——-n和值必须拆成两个独立字符串,否则 pytest 解析失败,静默退回到单进程 - 如果用了
--rootdir,确保它出现在pytestArgs最前面,否则-n可能因路径解析失败而降级 - 别在
pytest.ini里写addopts = -n auto:VSCode **不读取**pytest.ini的addopts,只认 settings.json 配置
“Run All Tests” 快捷键(Ctrl+Shift+P → “Test: Run All Tests”)会触发分布式吗?
会,但前提是 python.testing.pytestArgs 已包含 -n 类参数;否则它等价于纯 pytest 命令,无并发。
-
Ctrl+Shift+P→ “Test: Run All Tests” 和点击侧边栏“▶ Run All Tests”行为完全一致,都走同一套配置链 - 没有独立快捷键专用于“带 xdist 的运行”——想换并发数,只能改 settings.json 再手动刷新(点侧边栏 ↻)
- 改完
pytestArgs后,**必须点测试侧边栏右上角 ↻ 按钮**,否则旧缓存的测试列表仍按单进程模式加载,甚至可能报xdist plugin not found
为什么 Debug Test 断点在分布式下全失效?
因为 pytest-xdist 启动的是多个子进程,VSCode 调试器只 attach 到主 pytest 进程,无法跨进程捕获断点——这是设计限制,不是配置问题。
- 所有
Debug Test操作(无论点击按钮还是快捷键)都会自动禁用-n参数,强制退回到单进程模式运行 - VSCode 不提供“调试分布式子进程”的 UI 选项,也没法通过
launch.json绕过:它的module: "pytest"启动方式与 xdist 不兼容 - 真要调试,只能临时删掉
-n相关参数,或单独在终端跑pytest -n0 tests/test_xxx.py --pdb(-n0强制禁用分发) - 别指望
pytest-pdb在-n auto下工作:子进程崩溃时 pdb 不会弹出,只会打印 traceback 后退出
并发数设太高反而变慢?关键看 CPU 核心数和 I/O 类型
-n auto 并不等于“越多越好”,实际吞吐受测试类型制约极大。
- CPU 密集型测试(如数值计算):设
-n接近物理核心数(-n 4对 4 核 CPU)最稳;超配会导致频繁上下文切换,总耗时上升 - I/O 密集型测试(如 HTTP 请求、数据库查询):可设更高(
-n 8或-n 12),但需观察系统负载——如果大量测试卡在Waiting for connection,说明网络或 DB 连接池成了瓶颈,加进程数没用 - 混合型测试:用
--dist=loadgroup(按 test class 分组)比--dist=load(按 test function 分散)更稳定,避免一个慢测试拖垮整组 - 注意:VSCode 侧边栏的测试状态图标(✅/❌)只反映主进程汇总结果,子进程失败可能被吞掉,务必看终端输出的完整
pytest日志
真正卡住人的从来不是怎么写 -n,而是 VSCode 把“运行测试”和“调试测试”当成两个互斥通道——你没法一边享受并发速度,一边在 IDE 里点断点。需要的时候,就得接受切换模式:快跑用 pytestArgs + ↻,深挖用单进程 + 手动终端。











