簡體   English   中英

Python的單元測試未按預期初始化記錄器

[英]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.infologger.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM