Python 3 如何为模块中的外部函数编写单元测试

Python 3 how to write unit tests for try except outside functions in modules

我想知道如何为 try except 块编写 Python 3 单元测试 在 Python 模块中的函数定义之外定义的。

想象一下,在 package/module.py 中,我有一段代码如下:

进口os

try:
  CONSTANT = os.environ['NOT_EXISTING_KEY']
except KeyError:
  CONSTANT = False
finally:
  del os

(请不要介意实际代码,我知道我可以在这种特定情况下使用 os.getenv('NOT_EXISTING_KEY', False),我感兴趣的是真正测试模块中的 try-except 块(外部一个函数)的行为符合预期。

如何编写单元测试来检查 package.module.CONSTANT 是否设置为预期值?

在 unittest 文件中(我使用 pytest)我有类似的东西:

from package.module import CONSTANT

def test_constant_true():
  assert CONSTANT == 'expected_value'

测试 try 块是否正确执行,然后 CONSTANT 是否符合预期。

但是,我不知道如何模拟导入机制,以便 try 块中的 os.environ 引发异常,我可以测试 CONSTANT 是否设置为 False。

我该怎么做?

您可以使用monkeypatch设置环境变量,但您必须重新加载模块才能使更改生效:

from importlib import reload

from package import module


def test_constant_true(monkeypatch):
    monkeypatch.setenv('MY_KEY', '42')
    reload(module)
    assert module.CONSTANT == '42'


def test_constant_false():
    reload(module)
    assert not module.CONSTANT

鉴于 package/module.py 的内容:

import os

try:
    CONSTANT = os.environ['MY_KEY']
except KeyError:
    CONSTANT = False

您可以使用 mock.patch.dict 模拟环境并将值导入单元测试方法中。像这样:

from unittest import TestCase, mock

class YourTest(TestCase):
    @mock.patch.dict('os.environ', {'NOT_EXISTING_KEY': 'value'})
    def test_constant_key_defined(self, mocked):
        """ Tests when the key is defined """
        from package.module import CONSTANT
        self.assertEqual(CONSTANT, 'value')

    def test_constant_key_not_defined(self):
        """ Tests when the key is not defined """
        from package.module import CONSTANT
        self.assertEqual(CONSTANT, 'value')

你可以使用importlib.reload,比如@mrbean-bremen 的回答,我不熟悉。