VSCode升级后无法调试运行Python单元测试问题求助
我近期将VSCode从1.78.X版本升级至1.80.1后,突然无法在调试模式下运行编写的Python单元测试。
我的Python包结构如下:
myPackage/ |-- myPackage/ | |-- __init__.py | |-- example.py | |-- module1/ | | |-- __init__.py | | |-- ... |-- test/ | |-- __init__.py | |-- test_utils.py | |-- test_example.py | |-- module1/ | | |-- __init__.py | | |-- ... |-- config files... |-- README
在test_example.py测试文件中,我使用如下导入语句:
from test.test_utils import magic_function from myPackage.module1.system import Subsystem
通过VSCode GUI运行测试一切正常,但调试模式下会抛出ModuleNotFoundError: No module named test.test_utils,调整导入顺序后又会出现ModuleNotFoundError: No module named myPackage。
我不想在100+且仍在增加的测试文件中硬编码sys.path.append(...),此前在VSCode 1.78.X版本中该代码可正常运行。是否有适配调试模式的新设置?
我的工作区文件夹中有launch.json和settings.json文件,尝试修改调试测试配置:
旧配置:
{ "version": 0.2.0, "configurations": [ { "name": "Debug Unit Test", "type": "python", "request": "test", "justMyCode": false } ], "compounds": [] }
其中request属性"test"似乎已失效,我将其改为"launch",并尝试添加"cwd"属性("$(workspaceFolder)"),但均无效果。
解决方案
1. 配置工作区Python路径(settings.json)
在工作区的settings.json中添加以下配置,将项目根目录加入Python路径搜索列表:
{ "python.analysis.extraPaths": ["${workspaceFolder}"], "python.testing.cwd": "${workspaceFolder}" }
该配置会让VSCode的Python插件在运行和调试测试时,自动把外层myPackage目录(工作区根目录)加入sys.path,确保test和myPackage两个包都能被正确识别。
2. 调整launch.json调试配置
放弃失效的request: "test",改用针对单元测试的具体调试配置,分两种测试框架举例:
若使用pytest:
{ "version": "0.2.0", "configurations": [ { "name": "Debug Pytest", "type": "python", "request": "launch", "module": "pytest", "args": ["test/test_example.py"], // 可指定单个文件或整个test目录 "justMyCode": false, "cwd": "${workspaceFolder}" } ] }
若使用unittest:
{ "version": "0.2.0", "configurations": [ { "name": "Debug Unittest", "type": "python", "request": "launch", "module": "unittest", "args": ["test.test_example"], // 用模块路径而非文件路径 "justMyCode": false, "cwd": "${workspaceFolder}" } ] }
3. 验证Python解释器一致性
检查VSCode右下角状态栏显示的Python解释器,确保和运行测试时使用的是同一个环境。VSCode升级后可能会重置解释器选择,导致路径识别异常。
4. 标准项目结构配置(长期解决方案)
在项目根目录创建pyproject.toml文件,添加以下内容:
[build-system] requires = ["setuptools>=61.0"] build-backend = "setuptools.build_meta" [project] name = "myPackage" version = "0.1.0"
然后在终端执行pip install -e .,将项目以可编辑模式安装到Python环境中。这样Python会自动把项目根目录加入site-packages,无论运行还是调试都能直接识别所有包,彻底解决路径问题,这也是Python项目的标准实践。
内容的提问来源于stack exchange,提问作者SimonV

