如何为导入时加载的环境变量编写Python测试

问题描述 投票:0回答:1

我想测试系统在更改初始环境变量时的行为。

the_file.py:

import os

from fastapi import APIRouter

PREFIX = os.getenv("SERVICE_PREFIX") or "/default"

router = APIRouter(prefix=PREFIX)

测试.py:

# Following test is using pytest-mock library for mocker fixture
import os

def test_prefix_value_digested_correctly(mocker):
    mocker.patch.dict(
        os.environ,
        {
            "SERVICE_PREFIX": "/services",
        },
        clear=True,
    )
    del sys.modules['tip_subscription_db']
    from the_file import router
    assert router.prefix == "/services"

上述测试失败,因为在初始导入时读取了环境变量:

assert router.prefix == "/services"
E       AssertionError: assert '/default' == '/services'
E         - /services
E         + /default

我可以通过创建一个函数

get_prefix
来解决这个问题,该函数可以随时随地读取环境,但这不是这里的目标。目标是健全性检查 - “如果我设置 SERVICE_PREFIX 环境变量,则 router.prefix 应该更改”。

有没有办法动态地将这样的环境变量发送到python unittests/pytest?

python pytest python-unittest
1个回答
0
投票

使用函数来确定

PREFIX
,尽量不要测试“全局状态”:

import unittest
import os
from unittest import mock


def get_prefix():
    return os.getenv("SERVICE_PREFIX") or "/default"


class TestMyApi(unittest.TestCase):

    @mock.patch.dict(os.environ, {'SERVICE_PREFIX': '/FOO'})
    def test_get_prefix_from_os(self):
        self.assertEqual(get_prefix(), "/FOO")

    @mock.patch.dict(os.environ, {})
    def test_get_prefix_default(self):
        self.assertEqual(get_prefix(), "/default")


if __name__ == '__main__':
    unittest.main()

出:

----------------------------------------------------------------------
Ran 2 tests in 0.000s

OK
© www.soinside.com 2019 - 2024. All rights reserved.