为何添加tests目录的__init__.py可解决Pytest Discovery Error问题?
Pytest模块导入与VS Code调试问题
项目目录结构
├── modules | ├── __init__.py │ ├── data | | ├── __init__.py | | └── tables.py ├── tests │ └── test_tabels.py └── main.py
问题描述
运行pytest时触发Pytest Discovery Error,错误信息为ModuleNotFoundError: No module named modules。测试文件test_tabels.py中使用from modules.data import GetData导入待测试代码:
- 给
tests目录添加__init__.py后,错误消失,但不清楚原理 - 其他仓库没有
tests/__init__.py也无此问题 - CLI中能正常运行测试,但VS Code的调试器和测试面板仍报同样错误
原理解释
1. __init__.py的作用
__init__.py是Python识别目录为可导入包的标志。当你在tests/test_tabels.py中导入modules时,Python会从当前脚本的执行上下文查找模块:
- 没有
tests/__init__.py时,VS Code的pytest发现机制可能直接在tests目录下执行测试脚本,此时项目根目录(modules所在目录)不在Python的模块搜索路径(sys.path)中,导致找不到modules - 添加
tests/__init__.py后,tests被识别为一个包,Python会自动将项目根目录加入sys.path,从而可以正常找到modules模块
2. 为什么其他仓库没问题?
其他仓库可能存在以下情况:
- 已通过
pytest.ini、pyproject.toml等配置文件指定项目根目录,pytest会自动将根目录加入sys.path - 测试脚本使用了相对导入(但相对导入在独立运行脚本时易出问题)
- 系统环境变量
PYTHONPATH已包含项目根目录
VS Code调试/测试面板问题解决
VS Code的pytest插件默认运行上下文与CLI不同,需手动配置让它识别项目根目录:
- 在项目根目录创建
.vscode/settings.json,添加以下配置:{ "python.testing.pytestArgs": ["."], "python.testing.unittestEnabled": false, "python.testing.pytestEnabled": true, "python.analysis.extraPaths": ["${workspaceFolder}"] } - 配置完成后重启VS Code,测试面板和调试器即可正确识别
modules模块
内容的提问来源于stack exchange,提问作者andKaae
相关产品推荐
相关产品推荐

