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 的回答,我不熟悉。
我想知道如何为 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 的回答,我不熟悉。