首页 > 解决方案 > Python 3如何为try编写单元测试,除了模块中的外部函数

问题描述

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

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

导入操作系统

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。

我怎样才能做到这一点?

标签: pythonunit-testingpytestpython-modulepython-unittest.mock

解决方案


您可以使用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

推荐阅读