VSCode中pytest变慢的根源是文件监视冗余、cwd与PYTHONPATH未对齐及code-runner干扰;需配置files.watcherExclude、python.testing.cwd和python.envFile,并禁用code-runner的测试执行。

VSCode 默认的 Python 测试运行器不加速 pytest,它只是发现和触发——真正影响速度的是你有没有关掉无用监视、配对 cwd 和 PYTHONPATH、避开 code-runner 干预。
为什么 pytest 在 VSCode 里跑得比终端慢?
不是 pytest 本身慢,是 VSCode 默认把整个工作区扔给文件监视器,同时让 code-runner 插件在后台重复解析路径、加载环境。常见现象包括:
- 保存测试文件后,侧边栏“Testing”图标转圈超过 3 秒才刷新
- 点“Run Test”按钮,终端卡顿 1–2 秒才输出
collected 12 items - 频繁触发
ModuleNotFoundError,但同一命令在集成终端里秒出结果
根本原因:VSCode 的测试发现流程会启动独立的 Python 进程扫描测试文件,而这个进程默认工作目录(cwd)和模块导入路径(PYTHONPATH)没对齐项目结构。
必须改的三项 settings.json 配置
打开项目根目录下的 .vscode/settings.json,补全以下三块(缺一不可):
-
"files.watcherExclude"必须显式排除缓存目录:"**/venv/**": true, "**/__pycache__/**": true, "**/.mypy_cache/**": true—— 不写,VSCode 会在后台持续扫描这些目录,CPU 占用高,测试发现延迟明显 -
"python.testing.cwd"要指向源码根目录,比如你的包在src/mypackage/,那就设为"${workspaceFolder}/src"—— 否则from mypackage import x在测试里就炸 -
"python.envFile"指向".env",并在该文件里写PYTHONPATH=${workspaceFolder}/src—— 双保险,避免 pytest 加载 conftest.py 或 fixture 时找不到路径
别让 code-runner 干扰测试执行
很多人装了 code-runner 插件后,顺手点了右上角“▶️ Run Code”,结果 pytest 报错或静默失败。这是因为:
-
code-runner默认走自己的执行链,完全绕过 VSCode 的测试框架配置 - 它会把
test_*.py当普通脚本执行(等价于python test_foo.py),而不是python -m pytest test_foo.py - 此时
@pytest.mark.parametrize、fixture、conftest.py全部失效
解决方案:在工作区 settings.json 中加这一行:"code-runner.ignoreSelection": true,并确保你只通过侧边栏“Testing”面板或右键菜单里的“Run Test”来触发 pytest。
调试单个测试时 args 怎么写才不翻车
VSCode 调试 pytest 用的是 launch.json,里面 args 是数组,不是字符串。容易错的点:
- 想调试
tests/test_api.py里的test_login,args应为:["tests/test_api.py::test_login", "-s", "-v"]—— 冒号必须双写,单写会当成路径分隔符 - 如果测试文件在
src/tests/,且cwd已设为${workspaceFolder}/src,那args就不能写"./src/tests/...",直接写"tests/"即可 - 加
--capture=no等价于-s,但不要两个都写,否则 pytest 会报参数冲突
最常被忽略的细节:断点必须打在函数体第一行可执行语句上,比如 response = client.get("/login"),而不是 def test_login(): 那一行——后者只是定义,pytest 不会停在那里。


















