断点必须打在def test_xxx():函数体内部而非定义行,因pytest加载时仅解析函数定义、不执行函数体;vscode调试需配置"module": "pytest"而非"program",并正确设置cwd和pythonpath以避免导入错误。

断点打在哪才有效
在 def test_xxx(): 这行按 F9 打断点,调试时会直接跳过——因为 pytest 加载阶段只做函数定义,不执行函数体。真正执行从函数体第一句开始。
实操建议:
- 断点必须打在函数体内部,比如
assert前、变量赋值后、或调用被测函数的那行 - 如果用了 fixture,断点别打在参数名上(如
client),要打在使用它的第一行代码上 - 避免在
conftest.py的 fixture 函数定义行打断点,它在测试执行前就运行完了
launch.json 必须用 module 而不是 program
VSCode 默认调试配置走 program 字段,等价于 python test_file.py,但 pytest 必须以模块方式启动:python -m pytest。写 program 会导致断点不命中、报 No module named pytest 或直接提示 “Cannot launch program”。
实操建议:
- 删掉
program字段,它和module冲突 - 必须设
"module": "pytest" -
args是数组,例如:["tests/test_api.py::test_login", "-s"]——双冒号分隔文件与函数名 - 不要写成字符串
"tests/test_api.py::test_login -s",JSON 解析会失败
cwd 和 PYTHONPATH 不对,import 就炸
VSCode 调试器默认把当前打开的测试文件所在目录设为工作目录(cwd),但你的包结构可能在 src/ 或 app/ 下。终端里能跑的 from mypkg import utils,调试时就报 ModuleNotFoundError,根源几乎总是 cwd 没指向可导入路径。
实操建议:
- 显式设
"cwd": "${workspaceFolder}"(源码在项目根)或"cwd": "${workspaceFolder}/src"(源码在src/) - 配合
"env": {"PYTHONPATH": "${workspaceFolder}/src"}更稳妥,尤其多层嵌套包时 - 别依赖
pip install -e .—— VSCode 调试器不走setup.py或pyproject.toml的 editable 安装逻辑
测试侧边栏空白或 Debug Test 点不动
这不是调试配置的问题,而是 VSCode 根本没发现测试用例。常见原因是框架未启用、路径没配对、或命名不合规。
实操建议:
- 在
.vscode/settings.json中确认已禁用 unittest:"python.testing.unittestEnabled": false,并启用 pytest:"python.testing.pytestEnabled": true -
python.testing.pytestArgs必须明确指定搜索路径,比如["tests/", "-s"];若测试在src/tests/,得写["--rootdir=src", "tests/"],不能只写["src/tests/"] - 文件名必须是
test_*.py或*_test.py,函数名以test_开头,类名以Test开头 - 改完配置后,一定要点测试侧边栏右上角 ↻ 刷新按钮,VSCode 不自动重扫
cwd 和 sys.path 的隐式耦合:VSCode 调试器不继承终端环境变量,也不执行任何 shell 初始化脚本,所有路径都得靠配置项或 .env 显式声明。











