pytest运行FastAPI单元测试时触发ImportError:尝试相对导入但未知父包
pytest运行FastAPI单元测试时触发ImportError:尝试相对导入但未知父包
我之前在FastAPI+pytest的项目里也碰到过一模一样的导入问题,本质是Python运行测试时没法正确识别fastapi_app这个包的路径,不管是相对导入还是直接用绝对导入都踩了坑。下面给你几个靠谱的解决方案:
方案一:用pytest配置文件指定模块搜索路径(最推荐)
这个方法一劳永逸,直接告诉pytest去哪里找你的代码包:
- 在你的
app目录下新建一个pytest.ini文件,内容写:
[pytest] pythonpath = .
这个配置会把当前的app目录加入Python的模块搜索路径,这样fastapi_app就会被识别成一个顶级可导入包。
- 修改
test_process.py里的导入语句为绝对导入:
import pytest from fastapi.testclient import TestClient from fastapi_app.main import app # 这里改成绝对导入
- 回到
app目录重新运行pytest命令:
(venv) PS C:\Users\Administrador\Desktop\code\repo\fastapi_celery_redis\app> pytest
这样pytest就能正确找到app模块,不会再报导入错误了。
方案二:把本地包以开发模式安装到虚拟环境
另一种方式是让Python全局识别你的fastapi_app包,适合长期开发:
- 在
fastapi_app目录下(就是有__init__.py的那个文件夹)新建一个setup.py文件,内容可以很简单:
from setuptools import setup, find_packages setup( name="fastapi_app", version="0.1.0", packages=find_packages(), )
- 激活你的虚拟环境,然后在
app目录下执行安装命令:
(venv) PS C:\Users\Administrador\Desktop\code\repo\fastapi_celery_redis\app> pip install -e ./fastapi_app
-e参数表示开发模式安装,之后你修改代码不需要重新安装,Python就能直接识别fastapi_app这个包,不管你在哪个目录运行测试,from fastapi_app.main import app都能正常工作。
方案三:临时修改sys.path(应急用,不推荐)
如果你不想改配置或安装包,可以在测试文件开头手动添加路径,但这种方式不够优雅,项目结构变动就会失效:
import sys from pathlib import Path # 把fastapi_app目录加入模块搜索路径 sys.path.append(str(Path(__file__).parent.parent)) import pytest from fastapi.testclient import TestClient from main import app # 现在可以直接导入main了
最后再确认两个小细节:
- 你的
fastapi_app目录下已经有__init__.py(这点你已经满足了,没问题) - 运行测试时一定要激活虚拟环境,避免依赖版本冲突
备注:内容来源于stack exchange,提问作者AlJw
相关产品推荐
相关产品推荐

