Python的unittest没有按预期初始化logger

时间:2015-10-06 15:04:27

标签: python logging

我的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_main.py中我的函数内部的任何logger.infologger.debug语句(如some_func())将在适当的级别打印出来。

2 个答案:

答案 0 :(得分:3)

将此行移至主声明之外。

logger = logging.getLogger(__name__)

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

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

import logging

logger = logging.getLogger(__name__)

def some_func():
    .....

答案 1 :(得分:1)

这是因为logger仅在__name__ == "__main__"时定义。

通常,您将为每个文件定义一个记录器,例如:

logger = logging.getLogger(__name__)

在文件的顶部,导入后。

另请注意,logger中定义的Test.setUp是函数的本地,因此它不会做任何事情。