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