如何从 .env 文件加载变量以进行 pytests

exp*_*tal 5 python pytest flask

我正在 Flask 中编写一个 API,有时我会向注册的用户发送电子邮件。我将有关此电子邮件服务的变量存储在 .env 文件中。现在想测试我使用这些变量的部分,但我不知道如何从 .env 文件加载它们。

我基本上尝试了这里的所有答案https://rb.gy/0nro1a,猴子修补 setenv 如这里所示https://rb.gy/kd07wa + 这里和那里的其他提示。每个人都在某些方面失败了。我还尝试使用 pytest-dotenv。pytest-env、pytest.ini 等。但没有任何东西真正按预期工作,这对我来说非常困惑。

我的 pytests 装置看起来像这样

@pytest.fixture(autouse=True)
def test_client_db():

    # set up
    app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///"
    app.config["JWT_SECRET_KEY"] = "testing"

    with app.app_context():
        db.init_app(app)
        db.create_all()
    testing_client = app.test_client()
    ctx = app.app_context()
    ctx.push()

    # do testing
    yield testing_client

    # tear down
    with app.app_context():
        db.session.remove()
        db.drop_all()

    ctx.pop()
Run Code Online (Sandbox Code Playgroud)

load_dotenv(path/to/.env)我想知道为什么我不能简单地在夹具设置中的某处使用这样的行加载 .env 文件并完成?

有人可以向我解释作为新手如何以简单直接的方式读取 .env 变量以使用 pytest 吗?

真正对我有用的唯一方法是在运行测试时在命令行上传递环境变量。

FROM_EMAIL="some@email.com" MAILGUN_DOMAIN="sandbox6420919ab29b4228sdfda9d43ff37f7689072.mailgun.org" MAILGUN_API_KEY="245d6d0asldlasdkjfc380fba7fbskfsj1ad3125649esadbf2-7cd1ac2b-47fb3ac2" pytest tests
Run Code Online (Sandbox Code Playgroud)

但这是一种糟糕的方法,我不想每次运行测试时都将所有这些 var 写入命令行。

我只想写pytest test,我相信 .env 文件应该自动加载到某个地方。但在哪里以及如何呢?

任何帮助表示赞赏。

MrB*_*men 7

如果安装python-dotenv,则可以使用它从文件加载变量.env。这是一个最小的例子:

.env

SQLALCHEMY_DATABASE_URI="sqlite:///"
JWT_SECRET_KEY="testing"
Run Code Online (Sandbox Code Playgroud)

测试.py

import os

import pytest
from dotenv import load_dotenv


@pytest.fixture(scope='session', autouse=True)
def load_env():
    load_dotenv()


@pytest.fixture(autouse=True)
def test_client_db():
    print(f"\nSQLALCHEMY_DATABASE_URI"
          f"={os.environ.get('SQLALCHEMY_DATABASE_URI')}")
    print(f"JWT_SECRET_KEY={os.environ.get('JWT_SECRET_KEY')}")


def test():
    pass
Run Code Online (Sandbox Code Playgroud)

python -m pytest -s test.py给出:

============================================ test session starts ============================================
...
collected 1 item

test.py
SQLALCHEMY_DATABASE_URI=sqlite:///
JWT_SECRET_KEY=testing
.

============================================= 1 passed in 0.27s =============================================
Run Code Online (Sandbox Code Playgroud)

例如,环境变量在整个测试会话中设置,可用于配置您的应用程序。请注意,我没有在 中提供路径load_dotenv(),因为我将.env文件放在与测试相同的目录中 - 在您的代码中,您可能必须添加路径 ( load_dotenv(dotenv_path=your_path))。