VS Code调试pytest需配置launch.json的module为"pytest"并设置args,而非依赖插件;断点须打在函数体有效语句处,避免def行;常见问题可通过PYTHONPATH、console类型及终端参数调整解决。

VS Code 的 Python 调试器本身已经很强大,但默认不直接支持 pytest 用例的断点调试——你得告诉它“用 pytest 启动,而不是 python”。关键不在装插件,而在正确配置 launch.json 的 module 和 args。
让 VS Code 用 pytest 启动调试会话
VS Code 默认调试器走的是 python -m pdb 或直接执行脚本路径,而 pytest 是一个独立模块,必须显式指定为调试入口。否则打上断点后一按 F5,它会报错:ModuleNotFoundError: No module named 'pytest' 或直接跳过断点运行。
- 确保已安装
pytest(推荐用项目虚拟环境):pip install pytest - 在项目根目录打开命令面板(
Ctrl+Shift+P),运行Python: Select Interpreter,选对带pytest的解释器 - 生成或编辑
.vscode/launch.json,添加如下配置(不是覆盖整个文件,而是往configurations数组里加一项):
{
"name": "pytest",
"type": "python",
"request": "launch",
"module": "pytest",
"args": ["-s", "-v", "tests/"],
"console": "integratedTerminal",
"justMyCode": true
}
"module": "pytest" 是核心——它让调试器等价于执行 python -m pytest;"-s" 允许输出 print,"-v" 显示详细测试名,"tests/" 是你的测试目录路径,可按需改成 "tests/test_example.py::test_func" 精确到用例。
在 pytest 测试函数里设断点并触发调试
断点只能打在测试函数内部、或被测代码中,不能打在 def test_... 函数签名行——那行不执行。常见误操作是点在 def 上按 F9,结果运行时完全不中断。
立即学习“Python免费学习笔记(深入)”;
- 断点必须落在函数体第一行有效语句,比如
assert前、变量赋值后、或被调用函数内部 - 如果测试用例依赖 fixture,断点打在 fixture 函数内也生效(需确保该 fixture 被当前测试使用)
- 想调试某个特定测试?把
args改成["-s", "tests/test_api.py::test_login"],避免跑全量
调试 pytest 时常见错误和绕过方式
最常遇到的不是“断点不命中”,而是“进程退出太快”或“找不到测试文件”。这往往跟工作目录、Python path 或 pytest 配置有关。
-
ImportError: attempted relative import with no known parent package:说明 pytest 启动时没把项目根加进sys.path。在launch.json中加"env": {"PYTHONPATH": "${workspaceFolder}"} - 断点灰了(未绑定):检查是否在
args中指定了错误路径,或测试文件名不含test_前缀 / 不在pytest默认发现范围内 - 终端卡住无响应:去掉
"console": "integratedTerminal",改用"console": "internalConsole"(Windows 下更稳) - 想看
stdout但被 pytest 捕获:保留-s参数,且不要勾选 VS Code 设置里的python.testing.pytestArgs全局参数(容易和 launch.json 冲突)
真正麻烦的不是配置本身,而是 pytest 的发现机制和 VS Code 工作区路径之间的隐式耦合——哪怕只差一层 cd,pytest 就可能找不到测试模块。动手前先确认 python -m pytest tests/ 在终端能跑通,再进 VS Code 调试。










