Python pytest测试时类导入失败,如何兼顾代码运行与测试?
解决Python包导入兼容测试与主程序运行的问题
项目包结构
├── src/ │ ├── __init__.py │ ├── class_1.py │ ├── used_by_class_1.py └── tests/ ├── __init__.py └── test_class_1.py
问题描述
- 在
tests/test_class_1.py中使用import src.class_1导入后,测试可执行,但实例化class_1时,其内部导入used_by_class_1.py失败。 - 给内部导入添加
src.前缀后,测试正常,但运行主程序时会报错No module named 'src'。 - 希望不用修改
sys.path或重复导入这类不够优雅的方法,同时兼顾测试与代码运行。
解决方案
1. 用相对导入处理包内部依赖
直接修改src/class_1.py里的导入语句,换成相对导入:
# src/class_1.py # 导入整个模块 from . import used_by_class_1 # 或者导入模块里的特定对象 from .used_by_class_1 import TargetClassOrFunc
相对导入基于当前模块所在的包层级,不管是从外部测试导入,还是在包内部运行主程序,都能正确找到依赖模块。
2. 将src设为可安装包(推荐方案)
在项目根目录创建pyproject.toml配置文件,把src目录标记为包的根目录:
[build-system] requires = ["setuptools>=61.0"] build-backend = "setuptools.build_meta" [project] name = "your-package" version = "0.1.0" packages = ["src"]
然后在项目根目录执行命令:
pip install -e .
这会以可编辑模式安装你的包,之后:
- 主程序里可以直接用
from src.class_1 import Class1导入,不会再出现src模块找不到的错误。 - 测试文件里用
import src.class_1导入也能正常工作,内部的相对导入同样生效。
3. 调整测试运行方式
如果暂时不想安装包,就在项目根目录下用模块方式运行测试:
- 用pytest的话:
python -m pytest tests/
- 用unittest的话:
python -m unittest tests/test_class_1.py
这种运行方式会自动把项目根目录加入Python的搜索路径,让src被识别为顶级包,配合内部的相对导入,就能同时满足测试和主程序运行的需求。
内容的提问来源于stack exchange,提问作者Deano
相关产品推荐
相关产品推荐

