Python 如何从pytests的.env文件加载变量

Python 如何从pytests的.env文件加载变量,python,flask,pytest,Python,Flask,Pytest,我正在Flask中编写一个API,并在某个时候向注册用户发送电子邮件。我将有关此电子邮件服务的变量存储在.env文件中。现在我想测试一个我使用这些变量的部分,但是我不知道如何从.env文件加载它们 我在这里尝试了基本上所有的答案,猴子补丁setenv如这里所示+其他提示这里和那里。每个人都在某一点上失败了。我还尝试使用pytest dotenv。pytest-env、pytest.ini等等,但是没有任何东西能像预期的那样工作,这对我来说非常混乱 我的pytests夹具看起来像这样 @pytes

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

我在这里尝试了基本上所有的答案,猴子补丁setenv如这里所示+其他提示这里和那里。每个人都在某一点上失败了。我还尝试使用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()
我想知道为什么我不能简单地在fixture设置的某个地方加载.env文件,像这样的一行
load\u dotenv(path/to/.env)

作为一个新手,有人能向我解释一下如何用一种简单直接的方式读取.env变量来使用pytest吗

对我来说,唯一有效的方法是在运行测试时在命令行上传递环境变量

FROM_EMAIL="some@email.com" MAILGUN_DOMAIN="sandbox6420919ab29b4228sdfda9d43ff37f7689072.mailgun.org" MAILGUN_API_KEY="245d6d0asldlasdkjfc380fba7fbskfsj1ad3125649esadbf2-7cd1ac2b-47fb3ac2" pytest tests
但这是一种糟糕的方式,我不想每次运行测试时都将所有这些var写入命令行

我只想写
pytest
,我认为.env文件应该自动加载到某个地方。但在哪里,如何

非常感谢您的帮助。

如果您安装了,您可以使用它从
.env
文件中加载变量。下面是一个简单的例子:

环境署署长

test.py

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 =============================================

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

您可以使用pytest提供的monkeypatch夹具来操作env变量:

@pytest.fixture(scope=“function”)
def配置_环境(monkeypatch):
setenv(“SQLALCHEMY\u DATABASE\u URI”,“sqlite://”)
setenv(“JWT_密钥”,测试)
def测试客户端(已配置的环境):
#环境变量在这里设置

如何使用
def setup\u class(cls):
并加载文件?在哪里?这不是在赛程中完成的吗?收益率之前的一切都是“设置”。。否?您可以使用读取env文件,并在会话范围的装置中执行该操作(使用
autouse=True
)。您可以更具体一点吗?因为这是我在装置中尝试执行的操作。这也是为什么我问:为什么我不能简单地加载.env文件,在夹具的设置中的某个地方加载一行类似于load_dotenv(path/to/.env)的代码——它只是不起作用不确定你做了什么不同,但我只是测试了它,如答案所示,它对我来说很好。是的,它按照你所描述的那样起作用。我的问题其实在别处。我在一个类中封装了一些env变量,我需要将load_dotenv(dotenv_path=your_path)行直接放入该类中。仅在夹具中使用它是不够的。我不确定我是否理解,但你似乎已经找到了解决方案,所以这对你来说已经解决了,对吗?
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
============================================ test session starts ============================================
...
collected 1 item

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

============================================= 1 passed in 0.27s =============================================