Python单元测试中如何断言函数执行过程中未产生日志条目
Python标准库unittest框架从3.10版本开始,正式提供了assertNoLogs()方法,专门用于断言指定代码块执行过程中无匹配规则的日志输出。
3.10+ 版本原生用法
该方法作为上下文管理器使用,参数与assertLogs()完全对齐:
logger:指定待校验的日志器对象或名称,默认校验根日志器level:指定拦截校验的最低日志级别,默认值为logging.INFO
使用示例:
import logging import unittest class TestFunctionLog(unittest.TestCase): def test_no_log_generated(self): with self.assertNoLogs(level=logging.INFO): function_that_logs_nothing()
3.10 以下版本兼容实现
3.10之前的版本没有原生assertNoLogs()方法,可以基于assertLogs()的固有行为封装兼容逻辑:assertLogs()在上下文执行期间未捕获到匹配日志时,会抛出携带"no logs of level"信息的AssertionError,捕获到该异常即符合"无日志输出"的预期;如果上下文正常退出,反而说明捕获到了意外日志,判定用例失败。
兼容实现代码:
import logging import unittest class CompatTestCase(unittest.TestCase): def assertNoLogs(self, logger=None, level=logging.INFO): class _NoLogContext: def __init__(self, case, logger, level): self.case = case self.logger = logger self.level = level def __enter__(self): self._ctx = self.case.assertLogs(self.logger, self.level) return self def __exit__(self, exc_type, exc_val, exc_tb): if exc_type is None: raise AssertionError("Detected unexpected log output in target function") if exc_type == AssertionError and "no logs of level" in str(exc_val): return True return False return _NoLogContext(self, logger, level)
封装后的方法调用方式和原生assertNoLogs()完全一致。
pytest 框架实现
如果使用pytest作为测试框架,直接使用内置的caplog夹具即可实现校验,无需额外封装:
import logging def test_no_log_generated(caplog): caplog.set_level(logging.INFO) function_that_logs_nothing() assert len(caplog.records) == 0
注意:做无日志校验时必须显式指定校验的最低日志级别,默认配置下DEBUG级别的日志不会被拦截,容易造成漏判。
内容的提问来源于stack exchange,提问作者buhtz
相关产品推荐
相关产品推荐

