本地与Docker环境中pytest报ModuleNotFoundError: No module named 'app'问题
问题分析与解决方案
核心原因
- 导入路径错误:测试代码和
conftest.py中的导入未以app作为顶层包前缀,导致Python无法识别模块归属;同时app目录缺少__init__.py,无法被Python识别为合法包。 - 环境配置与运行路径不匹配:pytest运行时的Python路径未正确包含项目根目录,而Docker中应用能正常运行是因为启动命令(如
uvicorn app.main:app)默认以项目根为工作目录,自然识别app包。
分步解决方案
1. 补全包标识文件
在project-root/app/目录下创建空的__init__.py文件,让Python将app目录识别为可导入的包:
touch project-root/app/__init__.py
2. 修正所有导入语句
修正conftest.py
将原有导入改为以app为前缀的绝对导入:
from app.config import config from app.setup import create_app, db import os import pytest @pytest.fixture(scope='session') def app(): os.environ['ENV'] = 'test' app = create_app(config.SCHEDULER_API_ENABLED) yield app @pytest.fixture(scope='session') def client(app): with app.test_client() as client: with app.app_context(): db.create_all() yield client
修正test_import.py
同样改为带app前缀的绝对导入:
def test_import(): from app.data.technology.enums import TechnologyTypeEnum assert True
3. 配置pytest运行环境
方式一:通过环境变量临时运行
在项目根目录(project-root/)下执行:
PYTHONPATH=$(pwd) pytest app/tests/
方式二:通过pyproject.toml持久化配置
在project-root/pyproject.toml中添加pytest配置(如果已有该文件,直接追加):
[tool.pytest.ini_options] pythonpath = ["."] # 将项目根目录加入Python路径 testpaths = ["app/tests"] # 指定测试目录
之后在项目根目录直接运行pytest即可。
4. Docker环境下的测试运行
确保Docker容器的工作目录为project-root,并在容器内执行上述pytest命令。例如,Dockerfile中可添加:
WORKDIR /project-root # 安装依赖后,运行测试 CMD ["pytest"]
内容的提问来源于stack exchange,提问作者Baptiste Moulin
相关产品推荐
相关产品推荐

