首页 > 解决方案 > 使用 python unittests 验证 logging.critical 是否命中

问题描述

我在python中有一个代码如下:

import logging

def method():
  value = get_value()
  if value is not None:
    do_something()
  else:
    logging.critical("value cannot be None")

我想编写一个单元测试来涵盖上述两种情况。第一个成功案例很容易。但是对于失败的场景,捕获该 logging.critical 的正确方法是什么?

我试图将该方法放在 try-except 块中并且它有效。

... Mock required function and specify return values ...
try:
  method()
except Exception as ex:
  import traceback
  traceback.format_exc()

尽管上述方法有效,但我认为我没有正确捕捉到调用 logging.critical 而不是引发异常。正确的方法是什么?

标签: pythonunit-testinglogging

解决方案


你可以模拟记录器。但是,您当前使用的是默认记录器,您不希望对其进行模拟。您可以更改代码以使用特定于模块的记录器:

import logging

logger = logging.getLogger(__name__)

def method():
  value = get_value()
  if value is not None:
    return True
  else:
    logger.critical("value cannot be None")

method您可以将 Logger 对象作为参数传递给 ,而不是访问该全局 logger 对象method,或者在方法周围有一个类,并使 Logger 对象成为类成员,等等。

但是,保持示例不变,然后您可以模拟此记录器对象并断言它按预期调用:

import unittest
import unittest.mock

class TestStringMethods(unittest.TestCase):

    def test_method_withNone_shallLogCritical(self):
        # setup
        global logger
        tmpLogger = logger
        logger = unittest.mock.Mock()

        # exercise
        method()

        # verify
        logger.critical.assert_called() # python >= 3.6

        # teardown
        logger = tmpLogger

推荐阅读