VSCode调试pytest需正确配置launch.json:必须设"module": "pytest"、删program字段、args为数组、cwd指向项目根或src目录,并手动刷新测试面板。

VSCode 调试 pytest 不是点“虫子图标”就能跑通的事——断点不命中、ModuleNotFoundError、测试根本找不到,90% 都卡在 launch.json 的 module 和 args 没配对,或工作目录(cwd)不是你代码能 import 的地方。
launch.json 里必须写 "module": "pytest",不能写 "program"
VSCode 默认调试配置走的是 program 字段(比如 "program": "test_sample.py"),但这会让调试器尝试直接执行该文件,等价于 python test_sample.py,而 pytest 是以模块方式运行的:python -m pytest。不写 module 就永远进不了 pytest 入口,断点自然失效。
-
"module": "pytest"是唯一正确入口,它让调试器等价于执行python -m pytest - 删掉
program字段,否则 VSCode 会忽略module并报错“Cannot launch program” -
args必须是数组,比如["tests/", "-v", "-s"],不能写成字符串"tests/ -v" - 想调试单个用例?
args改成["tests/test_api.py::test_login"],冒号必须是双冒号
工作目录(cwd)不对,import 就会炸
VSCode 默认把当前打开的测试文件所在目录设为工作目录,但你的包结构可能在 src/ 或 app/ 下,from mypkg import utils 在终端里能跑,调试时却报 ModuleNotFoundError——就是因为 cwd 没指向项目根或源码根。
- 显式加
"cwd": "${workspaceFolder}",确保从工作区根启动 - 如果源码在
src/,就写"cwd": "${workspaceFolder}/src" - 配合
"env": {"PYTHONPATH": "${workspaceFolder}"}更保险,尤其多层嵌套包时 - 别依赖
__init__.py自动识别:pytest 只有在cwd可导入路径下才把目录当包处理
断点打在哪才有效?别点 def 行
在 def test_something(): 这行按 F9 打断点,调试时会直接跳过——因为 pytest 运行时这行只是定义,真正执行从函数体第一句开始。
- 断点必须打在函数体内可执行语句上,比如
response = client.get("/api")或assert result == 1 - fixture 内部也能打断点,但只在被当前测试实际调用时触发
- 检查编辑器右下角是否显示 Python 解释器路径(如
Python 3.11.5 ('venv': venv)),没显示说明解释器没激活,断点无效 - 别在
__pycache__文件里调试:地址栏路径含__pycache__就立刻关掉,那是缓存,不是源码
测试面板不显示新用例?手动刷新不是可选项
VSCode 测试侧边栏不会自动感知你新建的 test_*.py 或重命名后的文件。改完测试结构、挪了文件位置、甚至只改了 settings.json,旧缓存还在,新测试就是不出现。
- 必须点击测试侧边栏右上角的刷新按钮(↻),或按 Ctrl+Shift+P / Cmd+Shift+P,运行命令
Python: Discover Tests - 发现失败?检查
python.testing.pytestArgs是否和launch.json里的args冲突(比如都写了["tests/"]但路径不一致) - 如果用了
pyproject.toml,确认里面[tool.pytest]的testpaths和 VSCode 设置不打架
最常被跳过的其实是 cwd 和刷新动作——很多人反复重开 VSCode、重选解释器,却忘了点那个小小的刷新按钮,或者以为终端里能 import 就等于调试器里也能 import。


















