向pytest传递配置与env文件时路径报错的解决方法咨询
问题解决方案
报错根因
运行pytest时的默认工作目录是项目根目录,而app/.env里的PATH_TO_CONFIG="../configs/config.yml"是相对app目录的相对路径,两套运行场景(直接启动app、运行pytest测试)的工作目录不一致,导致路径解析失败。
方案1:无需调整项目结构,实现测试时自动使用正确路径
方法1:用pytest-env插件强制覆盖环境变量
你当前pytest.ini的配置已经符合要求,只需要做两个调整即可生效:
- 安装
pytest-env插件:pip install pytest-env - 修改你项目中加载.env文件的逻辑,以常用的
python-dotenv库为例,加载时保持默认参数override=False,已经存在的环境变量不会被.env文件的配置覆盖。pytest启动时会优先设置PATH_TO_CONFIG="configs/config.yml",加载.env时不会被覆盖,就可以正常找到配置文件。
方法2:通过pytest钩子函数修改环境变量
如果不想安装额外插件,可以在tests目录下新建conftest.py文件,写入以下内容:
import os import sys from dotenv import load_dotenv # 加载app目录下的.env文件 load_dotenv(os.path.join(os.path.dirname(os.path.dirname(__file__)), "app", ".env")) # 覆盖为测试场景的配置路径 os.environ["PATH_TO_CONFIG"] = "configs/config.yml" # 将项目根目录加入Python导包路径,避免测试时导包失败 sys.path.append(os.path.dirname(os.path.dirname(__file__)))
方案2:调整项目结构,统一路径规则
如果不想做环境变量覆盖逻辑,可以调整项目结构让两种场景下的路径都能正常解析:
调整后的项目结构如下:
project/ |-- pytest.ini |-- .env # 将原app目录下的.env移到项目根目录 |-- tests/ |-- test_class.py |-- configs/ |-- config.yml |-- app/ |-- class_i_want_to_test.py
修改.env内容为:
PATH_TO_CONFIG="configs/config.yml"
调整后不管是从项目根目录启动app,还是运行pytest测试,路径都可以正常解析。
优化建议
你也可以直接在代码中用基于文件位置的绝对路径,彻底避免工作目录不同导致的路径错误,示例代码:
import os # 基于当前文件的位置,计算config.yml的绝对路径 PROJECT_ROOT = os.path.dirname(os.path.dirname(__file__)) CONFIG_PATH = os.path.join(PROJECT_ROOT, "configs", "config.yml")
内容的提问来源于stack exchange,提问作者Егор Климов
相关产品推荐
相关产品推荐

