[英]Testing constants declarations using pytest
我們有一個 Python 3.7 應用程序,它有一個聲明為以下形式的 constants.py 文件:
APP_CONSTANT_1 = os.environ.get('app-constant-1-value')
在 test.py 中,我們希望使用類似這樣的方法來測試這些常量的設置(這是高度簡化的,但代表了核心問題):
class TestConfig:
"""General config tests"""
@pytest.fixture
def mock_os_environ(self, monkeypatch):
""" """
def mock_get(*args, **kwargs):
return 'test_config_value'
monkeypatch.setattr(os.environ, "get", mock_get)
def test_mock_env_vars(self, mock_os_environ):
import constants
assert os.environ.get('app-constant-1-value') == 'test_config_value' #passes
assert constants.APP_CONSTANT_1 == 'test_config_value' #fails
第二個斷言失敗,因為 constants.constants.APP_CONSTANT_1 為 None。 事實證明,constants.py 似乎是在 pytest 的“收集”階段加載的,因此在運行測試時已經設置好了。
我們在這里缺少什么? 我覺得在 pytest 中有一個簡單的方法可以解決這個問題,但還沒有發現這個秘密。 有什么方法可以避免在測試運行之前加載常量文件? 任何想法表示贊賞。
問題很可能是之前已加載過constants
。 為確保它獲得修補后的值,您必須重新加載它:
import os
from importlib import reload
import pytest
import constants
class TestConfig:
"""General config tests"""
@pytest.fixture
def mock_os_environ(self, monkeypatch):
""" """
monkeypatch.setenv('app-constant-1-value', 'test_config_value')
reload(constants)
def test_mock_env_vars(self, mock_os_environ):
assert os.environ.get('app-constant-1-value') == 'test_config_value'
assert app.APP_CONSTANT_1 == 'test_config_value'
請注意,我使用monkeypatch.setenv
專門設置您需要的變量。 如果您不需要更改所有環境變量,這更容易使用。
嗯,我會避免使用常量。 您可以先將 os.environment 子類化,然后使用模擬子類進行單元測試,因此您可以將 my_env.unique_env 作為成員變量。 然后你可以使用例如。 導入 json 以使用 json 配置文件,而不涉及硬編碼的 python。
然后子類可以保存相關變量(或方法,如果您願意)
能夠為 os.environment 添加外觀為您提供了您正在尋找的抽象,而沒有任何問題。
即使是使用遺留/更大的項目,使用適配器訪問環境的優勢也必須是顯而易見的。
由於您正在編寫單元測試,因此有機會在測試和正在測試的功能中使用適配器 class。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.