簡體   English   中英

如何從 .env 文件為 pytests 加載變量

[英]How to load variables from .env file for pytests

我正在 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()

我想知道為什么我不能簡單地在固定裝置的設置中的某處加載像這樣的行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

但這是一種糟糕的方式,我不想每次運行測試時都將所有這些 var 寫入命令行。

我只想編寫pytest test ,我相信 .env 文件應該自動加載到某個地方。 但是在哪里以及如何?

任何幫助表示贊賞。

如果安裝python-dotenv ,則可以使用它從.env文件加載變量。 這是一個最小的例子:

.env

SQLALCHEMY_DATABASE_URI="sqlite:///"
JWT_SECRET_KEY="testing"

測試文件

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

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

例如,環境變量在整個測試會話中設置,可用於配置您的應用程序。 請注意,我沒有在load_dotenv()提供路徑,因為我將.env文件放在與測試相同的目錄中 - 在您的代碼中,您可能必須添加路徑( load_dotenv(dotenv_path=your_path) )。

你可以使用pytest提供的monkeypatch fixture來操作env變量:

@pytest.fixture(scope="function")
def configured_env(monkeypatch):
    monkeypatch.setenv("SQLALCHEMY_DATABASE_URI", "sqlite:///")
    monkeypatch.setenv("JWT_SECRET_KEY", testing)
def test_client(configured_env):
 #env variables are set here

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM