python - 使用 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 而不是引发异常。正确的方法是什么?
解决方案
你可以模拟记录器。但是,您当前使用的是默认记录器,您不希望对其进行模拟。您可以更改代码以使用特定于模块的记录器:
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
推荐阅读
- postgresql - 在 postgresql 中测量复制滞后
- r - 带有插入符号的 R 特征选择 - 将结果图限制在前 10 位,并将完整结果存储到数据框中
- sapui5 - SAP UI5 值帮助仅适用于 Smartfield
- excel-formula - 选择 Randbetween 函数给我一个#NAME?Excel中的错误
- python - Pandas 中的子集分层索引和分层列名(有和没有索引)
- swift - 如何在依赖firebase API的ios项目上实现测试
- jquery - 数据表未填充 .html() 生成的表
- html - ASP Net Core Angular - 使用 bootstrap 4 而不是 3 (SideMenu) 的默认项目
- vba - 如果找到“%”符号,则创建用于格式化单元格的宏
- swift - 如何将 json 值转换为整数数组 [Swift]