Python Unittest使用Patch打补丁解决Logging变量相关报错求助
报错原因分析
- 首次运行出现
NameError: name 'logger' is not defined
你将logger的初始化逻辑写在了if __name__ == '__main__'代码块中,该代码块仅在直接执行main.py时才会运行。当测试脚本导入main模块时,这段初始化代码不会执行,因此main模块顶层不存在logger变量,checkin函数运行时自然找不到对应引用。 - 打补丁后出现
AttributeError@patch.object(main, "logger")的作用是替换main模块上已存在的logger属性,而你导入的main模块本身没有该顶层属性,补丁找不到替换目标就会抛出属性不存在的错误。
解决方案
方案1:修正main.py初始化逻辑(推荐)
将logger的初始化逻辑移到模块顶层,确保导入模块时也能生成logger属性:
import logging import centralised_log.log as log #custom module to override logging # 初始化逻辑移到顶层 logging.setLoggerClass(log.Log) logging.basicConfig() logger = logging.getLogger(__name__) def checkin(): # 注意:此处resp变量也未定义,修完logger问题后需补充resp的赋值逻辑,否则仍会报错 logger.warning(f"checkin failed - {resp.status_code} | {resp.text}") if __name__ == '__main__': # 原有主程序启动逻辑可保留在此处 pass
修改完成后,你原来写的补丁代码即可正常运行。
方案2:不修改main.py的测试适配方案
如果不允许改动main.py的代码,可在测试用例执行前手动给main模块注入logger属性:
import main from unittest.mock import MagicMock def test_check_in(self): # 手动给main模块添加logger属性 main.logger = MagicMock() main.checkin() # 可按需添加断言,比如验证warning是否正确调用 main.logger.warning.assert_called_once()
内容的提问来源于stack exchange,提问作者Nishan Nilupul
相关产品推荐
相关产品推荐

