Python测试模块组织与unittest导入报错问题咨询
咱们先拆解你的问题,分两部分说清楚:
1. 把src加入PYTHONPATH的做法是否合理?
这个做法是可行的临时方案,但不算最规范。
手动设置PYTHONPATH确实能让Python找到src目录下的模块,但缺点是每次启动新终端都得重新配置,团队协作时也需要同步这个设置。更推荐的方式是把项目做成可安装的开发包(用pyproject.toml或传统的setup.py),然后用pip install -e .安装「可编辑版」,这样Python会自动识别src里的模块,不需要手动折腾PYTHONPATH。
不过回到你的问题:当前做法本身是合理的,不是导致报错的直接原因。
2. 为什么运行整个test目录报错,单独运行test/core却正常?
核心问题出在test/adapters/test_adapter.py的导入语句上,当你运行整个test目录时,这个文件被加载,触发了错误的导入逻辑:
常见错误场景:
场景一:错误使用了
src.前缀
如果test_adapter.py里写的是from src.proc import Proc,而你已经把src目录加入了PYTHONPATH,这时候Python会把src当作一个模块(而非目录)来查找——但src目录本身不是一个Python模块(除非你给它加了__init__.py),自然找不到src.proc里的Proc类。而test/core/test_proc.py里应该是正确的写法:
from proc import Proc,所以单独运行test/core时不会触发这个错误。场景二:错误使用了相对导入
如果test目录下有__init__.py(被当作Python包),而test_adapter.py里写了from ..proc import Proc,这种相对导入会试图从test目录的父目录(你的项目根目录)查找proc模块,但你的proc在src里,父目录下并没有proc.py,所以会报「cannot import name 'Proc'」的错误。
快速解决步骤:
- 统一导入语句:让test_adapter.py的导入和test_proc.py保持一致,比如都写成
from proc import Proc(导入adapter模块就写from adapter import Adapter)。 - 验证PYTHONPATH配置:在项目根目录执行
echo $PYTHONPATH(Linux/macOS)或echo %PYTHONPATH%(Windows),确认src目录的路径(绝对路径或相对路径,确保当前工作目录是项目根)已经包含在内。 - (可选)切换到规范的包管理方式:
在项目根目录创建pyproject.toml文件,内容如下:
然后运行[build-system] requires = ["setuptools>=61.0"] build-backend = "setuptools.build_meta" [project] name = "your-project-name" version = "0.1.0" packages = ["src"] package_dir = {"": "src"}pip install -e .,之后不管在哪里运行测试,直接执行python3 -m unittest discover -s test/即可,再也不用手动设置PYTHONPATH。
内容的提问来源于stack exchange,提问作者Madden

