![](/img/trans.png)
[英]Pytest: How to test class variable that is set from environment variable?
[英]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 在運行任何測試之前崩潰。
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
# 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.