Flask运行测试时无法导入根目录application模块报错排查
问题描述
我的项目文件夹结构如下图所示:

根目录下的application.py文件中使用工厂方法create_app()创建Flask实例,代码如下:
# application.py def create_app(): flask_app = Flask(__name__) return flask_app app = create_app() # --- Import Routes --- from src.routes import * if __name__ == "__main__": app.run()
tests测试文件夹下的测试代码如下:
# /tests/test.py from application import create_app def test_root_route(): flask_app = create_app() with flask_app.test_client() as test_client: response = test_client.get('/') assert response.status_code == 200
运行测试时抛出如下错误:
from application import create_app ModuleNotFoundError: No module named 'application'
限制条件:受服务器运行要求限制,无法修改现有文件夹结构,application.py必须放置在项目根目录。
报错原因
Python导入模块时会从sys.path记录的路径列表里搜索目标模块。直接运行tests目录下的测试文件时,Python默认会把测试文件所在的tests目录加入搜索路径,而项目根目录不在搜索列表里,自然找不到根目录下的application.py。
可行解决方案
以下方案均不需要调整现有目录结构,符合部署要求:
运行测试时临时指定PYTHONPATH
在项目根目录下执行测试命令时,手动把根目录加入Python模块搜索路径:- Mac/Linux 终端:
PYTHONPATH=. pytest tests/ - Windows CMD:
set PYTHONPATH=. && pytest tests/ - Windows PowerShell:
$env:PYTHONPATH="."; pytest tests/
- Mac/Linux 终端:
测试文件开头动态添加根目录到搜索路径
在tests/test.py所有业务导入语句的最前面,加入如下代码,运行时自动把项目根目录加入搜索路径:import sys from pathlib import Path # 取当前测试文件的上级目录(即项目根目录)加入搜索路径 sys.path.append(str(Path(__file__).parent.parent.resolve())) # 后面再写原有导入逻辑 from application import create_app添加pytest配置自动识别根目录
在项目根目录新建pytest.ini配置文件,写入以下内容,后续执行pytest时会自动把根目录加入模块搜索路径,不需要额外加参数:[pytest] pythonpath = . testpaths = tests配置完成后直接在根目录执行
pytest命令即可正常运行测试。
内容的提问来源于stack exchange,提问作者mmargo
相关产品推荐
相关产品推荐

