pytest无法加载.env文件的根本原因是未显式调用load_dotenv(),因其不执行应用入口文件,需在conftest.py顶部调用并指定路径,否则os.environ为空。

因为 pytest 默认不加载 .env 文件,它和你的应用代码运行在不同的环境上下文中——即使你用了 python-dotenv,也得显式调用 load_dotenv(),否则变量根本不会进 os.environ。
pytest 启动时根本没执行 load_dotenv()
很多项目只在主应用入口(比如 main.py 或 app.py)里调用一次 load_dotenv(),但 pytest 不会运行那个文件。测试进程启动后,os.environ 里压根没有 .env 的内容。
- 验证方法:在任意测试文件开头加
import os; print(os.environ.get("DB_URL")),大概率输出None - 不是路径问题,也不是文件名问题,是根本没触发加载逻辑
-
python-dotenv不会自动 hook 进 Python 启动流程,它只是个工具库
在 conftest.py 中统一加载 .env 最可靠
把 load_dotenv() 放到项目根目录下的 conftest.py,pytest 会在所有测试前自动导入这个文件,确保环境变量就位。
- 确保
conftest.py和.env在同一级目录,或显式传入路径:load_dotenv(".env") - 如果
.env在子目录(如config/.env),必须写全路径:load_dotenv("config/.env") - 加
override=True避免被系统已有变量覆盖:load_dotenv(override=True) - 别放在
__init__.py或测试文件里——容易漏加载,或重复加载导致不可预测行为
pytest.ini 或 pyproject.toml 里不能配置环境变量加载
pytest 的配置文件(pytest.ini、pyproject.toml)只控制 pytest 自身行为,比如 addopts、testpaths,它不解析或注入环境变量,更不会调用 python-dotenv。
立即学习“Python免费学习笔记(深入)”;
- 写
env = DB_URL=xxx在[tool:pytest]下完全无效 - 试图用
setenv(来自pytest-env插件)只能设静态值,无法读取.env文件内容 - 依赖插件(如
pytest-dotenv)看似省事,但版本兼容性差,且仍需确认它是否真在 import 阶段生效
最易被忽略的点:团队协作时有人本地设置了系统级环境变量,测试“碰巧”通过;CI 环境没 .env 文件也没手动加载,测试就挂——根本原因从来不是文件格式或编码,而是加载时机缺失。


















