簡體   English   中英

使用 pytest 測試常量聲明

[英]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.

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