Python单元测试:如何验证方法未调用特定消息的logging.info(含一次调用)
问题:验证logging.info仅被调用一次(排除特定合法调用)
我需要对一个会三次调用logging.info的方法做单元测试:第一次调用用于记录方法的局部变量,另外两次会在特定条件满足时触发。在某个测试用例中,要求logging.info仅被调用一次(即记录局部变量的那次),另外两次不能触发。但因为存在一次合法调用,没法用unittest.mock.Mock.assert_not_called()验证,而且我没法测试局部变量对应的logging.info消息。现有测试代码如下:
class Test_create_s3_file(unittest.TestCase): ... def setUp(self): self.LOGGER = logging ... def test_success_basic(self): # Mocks self.LOGGER.info = MagicMock() ... # Calls ... self.LOGGER.info.assert_not_called() # Does not work because it has one call for local variables
解决方案
方法1:直接验证调用次数
使用assert_called_once()断言logging.info仅被调用一次,这就能直接确保另外两个条件分支的调用未触发:
class Test_create_s3_file(unittest.TestCase): ... def setUp(self): self.LOGGER = logging ... def test_success_basic(self): # Mocks self.LOGGER.info = MagicMock() ... # 执行被测试的方法 create_s3_file(...) # 替换为实际调用被测试方法的代码 # 验证logging.info仅被调用一次 self.LOGGER.info.assert_called_once()
方法2:(可选)结合日志内容增强验证
如果能确定局部变量日志的特征(比如包含特定关键词),可以同时验证调用参数,让测试更严谨:
from unittest.mock import ANY class Test_create_s3_file(unittest.TestCase): ... def test_success_basic(self): self.LOGGER.info = MagicMock() ... create_s3_file(...) # 验证调用次数为1,且日志内容包含指定关键词 self.assertEqual(self.LOGGER.info.call_count, 1) self.LOGGER.info.assert_called_with(ANY, string_containing("局部变量相关标识"))
如果无法通过日志内容做匹配,assert_called_once()已经足够满足需求——它直接验证了总调用次数为1,等价于另外两个条件分支的调用未触发。
内容的提问来源于stack exchange,提问作者Myklebost
相关产品推荐
相关产品推荐

