我的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()
Run Code Online (Sandbox Code Playgroud)
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()
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
该错误是有道理的,因为some_func()试图使用logger它的范围内不存在的东西,我想弄清楚如何使用记录器(设置在DEBUG级别)来设置我的单元测试,以便我的函数内的任何logger.info或logger.debug语句(例如as some_func()) 中的 logger_main.py 将在适当的级别打印出来。
将此行移到主声明之外。
logger = logging.getLogger(__name__)
Run Code Online (Sandbox Code Playgroud)
main 将定义日志的去向,但不应用于定义记录器。您的模块应该在其全局上下文中声明记录器。
您可以(并且应该)根据需要定义尽可能多的记录器,通常每个文件或类都有一个记录器,并在导入后声明它,以便在后面的代码中的任何地方都可以使用它。
import logging
logger = logging.getLogger(__name__)
def some_func():
.....
Run Code Online (Sandbox Code Playgroud)