You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python Unittest使用Patch打补丁解决Logging变量相关报错求助

报错原因分析

  1. 首次运行出现NameError: name 'logger' is not defined
    你将logger的初始化逻辑写在了if __name__ == '__main__'代码块中,该代码块仅在直接执行main.py时才会运行。当测试脚本导入main模块时,这段初始化代码不会执行,因此main模块顶层不存在logger变量,checkin函数运行时自然找不到对应引用。
  2. 打补丁后出现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 01:45:04