如何让pytest正确识别待测试代码文件 解决ModuleNotFoundError报错
解决pytest无法识别待测试模块的方案
报错核心原因有两点:
- 运行pytest时,源码所在目录没有被加入Python的模块搜索路径
- 导入语句硬编码了外层目录名,docker环境目录名变更后无法匹配
对应解决方案如下:
方案1:使用conftest.py动态配置搜索路径(适配多环境最优解)
该方案不需要修改项目全局配置,也不依赖外层目录命名,本地和docker环境可以通用。
- 在
tests目录下新建名为conftest.py的文件,pytest运行时会自动加载该文件 - 写入以下代码,自动将
server.py所在的根目录加入Python搜索路径:
import sys from pathlib import Path # 自动获取tests目录的上级目录(即server.py所在目录),加入搜索路径 sys.path.append(str(Path(__file__).parent.parent.resolve()))
- 修改测试文件的导入语句,去掉硬编码的外层目录名:
from server import app
方案2:通过pytest配置文件指定搜索路径
如果不想新增conftest.py,也可以用pytest的内置配置实现:
- 在
server.py所在的根目录(本地为my_server,docker为imported_files)新建pytest.ini配置文件 - 写入以下内容:
[pytest] pythonpath = .
- 同样修改测试文件导入语句为
from server import app即可。
方案3:可编辑安装(适合正式维护/发布项目)
如果你的项目需要长期维护或对外发布,可以通过包配置实现全局模块识别:
- 在项目根目录新增
pyproject.toml配置文件,示例配置如下:
[build-system] requires = ["setuptools>=61.0"] build-backend = "setuptools.build_meta" [project] name = "my-server" version = "0.1.0" packages = ["."]
- 运行
pip install -e .执行可编辑安装,之后不管在任何目录运行pytest都可以正确识别模块,导入语句同样使用from server import app即可。
内容的提问来源于stack exchange,提问作者user1584421
相关产品推荐
相关产品推荐

