Skip to main content
 首页 » 编程设计

Python 的单元测试没有按预期初始化记录器

2025年05月04日30pander-it

我的 unittest 模块在测试我的主文件时中断,因为我的主文件引用了一个未初始化的记录器。

我们有以下简单示例。

logger_main.py:

import logging 
 
def some_func(): 
    logger.info(__name__ + " started ") 
    # Do something 
    logger.info(__name__ + " finished ") 
    return 1 
 
if __name__ == '__main__': 
    logging.basicConfig(level=logging.INFO) 
    logger = logging.getLogger(__name__) 
    some_func() 

logger_main_tests.py:

import unittest 
import logging 
from logger_main import some_func 
 
class Test(unittest.TestCase): 
    def setUp(self): 
        logging.basicConfig(level=logging.DEBUG) 
        logger = logging.getLogger(__name__) 
 
    def testName(self): 
        self.assertEqual(some_func(), 1) 
 
if __name__ == "__main__": 
    unittest.main() 

logger_main.py 按预期运行,但是,logger_main_tests.py 出现以下错误。

Finding files... done. 
Importing test modules ... done. 
 
====================================================================== 
ERROR: testName (logger_main_tests.Test) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
  File "C:\workspaces\PythonPlayground\DataStoreHierarchy\logger_main_tests.py", line 11, in testName 
    self.assertEqual(some_func(), 1) 
  File "C:\workspaces\PythonPlayground\DataStoreHierarchy\logger_main.py", line 4, in some_func 
    logger.info(__name__ + " started ") 
NameError: name 'logger' is not defined 
 
---------------------------------------------------------------------- 
Ran 1 test in 0.003s 
 
FAILED (errors=1)         

该错误是有道理的,因为 some_func() 正在尝试使用其范围内不存在的 logger,我想弄清楚如何设置我的使用记录器(设置在 DEBUG 级别)进行单元测试,以便我的函数内的任何 logger.info 或 logger.debug 语句(例如some_func()) in logger_main.py 将在适当的级别打印出来。

请您参考如下方法:

将此行移到您的主要声明之外。

logger = logging.getLogger(__name__) 

main 将定义日志的去向,但不应用于定义记录器。您的模块应该在其全局上下文中声明记录器。

您可以(并且应该)根据需要定义尽可能多的记录器,通常每个文件或类都有一个记录器并在导入后声明它,这样它就可以在后面的代码中的任何地方使用。

import logging 
 
logger = logging.getLogger(__name__) 
 
def some_func(): 
    .....