[英]Python's unittest doesn't initialize logger as expected
測試主文件時,由於我的主文件引用了未初始化的記錄器,因此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()
在logger_main.py將在適當級別打印出來。
將此行移到主聲明之外。
logger = logging.getLogger(__name__)
main將定義日志的去向,但不應用於定義記錄器。 您的模塊應在其全局上下文中聲明記錄器。
您可以(並且應該)定義所需的多個記錄器,通常在每個文件或類中都有一個記錄器,並在導入后進行聲明,以便在后續代碼中的任何位置都可以使用。
import logging
logger = logging.getLogger(__name__)
def some_func():
.....
這是因為僅在__name__ == "__main__"
時定義logger
。
通常,您將為每個文件定義一個記錄器,如下所示:
logger = logging.getLogger(__name__)
在文件頂部,導入之后。
另外,請注意,在Test.setUp
定義的logger
是該函數的本地logger
,因此它不會執行任何操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.