簡體   English   中英

如何在pytest中設置環境變量

[英]How to set environment variable in pytest

我有一個使用環境變量的 Lamba 處理程序。 如何使用 pytest 設置該值。 我收到錯誤

tests/test_kinesis.py:3: in <module>
    from runner import kinesis
runner/kinesis.py:6: in <module>
    DATA_ENGINEERING_BUCKET = os.environ["BUCKET"]
../../../../../.pyenv/versions/3.8.8/lib/python3.8/os.py:675: in __getitem__
    raise KeyError(key) from None
E   KeyError: 'BUCKET'
7:03

我嘗試在測試中像這樣設置

class TestHandler(unittest.TestCase):
    @mock_s3
    @mock_lambda
    def test_handler(monkeypatch):
        monkeypatch.setenv("BUCKET", "test-bucket")
        actual = kinesis.handler(kinesis_stream_event, "")
        expected = {"statusCode": 200, "body": "OK"}
        assert actual == expected
DATA_ENGINEERING_BUCKET = os.environ["BUCKET"]


def handler(event, context):
...

在您的monkeypatch 能夠運行之前,您就遇到了故障。 環境變量的加載將在首次導入 runner 模塊時發生。

如果這是您擁有的模塊,如果未設置 DATA_ENGINEERING_BUCKET,我建議修改代碼以使用默認值。 然后您可以在運行時通過調用module.DATA_ENGINEERING_BUCKET = "my_bucket"將其值修改為您想要的任何值。

DATA_ENGINEERING_BUCKET = os.environ.get("BUCKET", default="default_bucket")

如果您無法修改該文件,那么事情就會變得更加復雜。

我研究了創建一個全局裝置,在任何測試加載之前,對環境進行猴子補丁並加載一次模塊,並收到有關在會話級裝置中使用函數級裝置的 pytest 錯誤。 這很有意義,monkeypatch 真的不是為了長期偽造東西。 您可以在monkeypatch 之后將模塊負載粘貼到您的測試中,但這會生成大量樣板文件。

最終創建了一個夾具來提供類而不是導入它。 夾具; os.environ設置為所需的值,加載模塊,將 os.environ 重置為其原始值,然后生成模塊。 任何需要此模塊的測試都可以請求夾具在其范圍內訪問它。 需要注意的是,因為測試文件是在運行夾具之前導入的,任何不使用夾具並正常導入模塊的測試文件都會引發 KeyError 並導致 pytest 在運行任何測試之前崩潰。

conftest.py
import os, pytest

@pytest.fixture(scope='session')
def kinesis():
    old_environ = os.environ
    os.environ = {'BUCKET': 'test-bucket'}
    import kinesis
    os.environ = old_environ
    yield kinesis
測試.py
# Do NOT import kinesis in any test file. Rely on the fixture.
class TestHandler(unittest.TestCase):
    @mock_s3
    @mock_lambda
    def test_handler(kinesis):
        actual = kinesis.handler(kinesis_stream_event, "")
        expected = {"statusCode": 200, "body": "OK"}
        assert actual == expected

一種可能更簡單的方法

os.environ是在 os 首次加載時創建的環境變量字典。 如果您希望每個測試都有一個值,那么您只需要在加載任何測試模塊之前添加您想要的值。 如果您將os.environ['BUCKET'] = 'test-bucket'放在 conftest.py 的頂部,您將為測試會話的其余部分設置環境變量。 然后只要模塊的第一次導入發生在之后,您就不會出現關鍵錯誤。 這種方法的最大缺點是,除非您知道查看 conftest.py 或 grep 代碼,否則在進行故障排除時很難確定環境變量的設置位置。

暫無
暫無

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

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