2017-09-01 84 views
0

我正在處理一個項目,該項目每次運行時都會創建一個不同的日誌文件。我有一些測試我的代碼的單元測試,但在這個過程中也會導致創建日誌文件。我的應用程序代碼如下所示:在單元測試期間禁用python日誌記錄

module.py

import logging 
from uuid import uuid4 

class TestRun: 

    def __init__(self): 
     self.test_run_id = str(uuid4()) 
     self.logger = logging.getLogger(__name__) 
     self.logger.setLevel(logging.INFO) 
     handler = logging.FileHandler('{}.log'.format(self.test_run_id)) 
     self.logger.addHandler(handler) 

    def prep_test_run(self): 
     self.logger.info('Starting prep') 

if __name__ == '__main__': 
    tr = TestRun() 
    tr.prep_test_run() 

我的測試代碼是這樣的:

import unittest 
from module import TestRun 

class TestModule(unittest.TestCase): 
    def test_function(self): 
     tr = TestRun() 
     tr.prep_test_run() 

我每次運行單元測試文件被創建。有沒有辦法在運行單元測試時禁用它。我試圖在def setUp(self)中設置日誌級別,但它不起作用。

+0

我不確定測試的確切內容,但您可以:在寫入文件之後清理文件,或將標記傳入一個或兩個類的方法(如'test = 1'),在這些情況下,您創建if語句以跳過代碼中使日誌文件不需要的步驟。 – JacobIRR

+0

請注意,像'setUp'一樣,Unit Tests支持'tearDown()'方法來處理完全像這樣的事情。 – JacobIRR

回答

0

我看到了兩條處理此路徑的路徑:要麼刪除處理程序,要麼從不首先創建它。

爲先,請從記錄器處理程序test_function

def test_function(self): 
    tr = TestRun() 
    tr.logger.handlers = [] 

這是非常強力(它消除所有的日誌處理程序,所以用它小心),但它應該解決問題。

第二種方法是控制是否可以通過添加關鍵字參數TestRun.__init__生產擺在首位的日誌,是這樣的:

class TestRun: 
    def __init__(self, file_logs = True): 
     self.test_run_id = str(uuid4()) 
     self.logger = logging.getLogger(__name__) 
     self.logger.setLevel(logging.INFO) 
     if file_logs: 
      handler = logging.FileHandler('{}.log'.format(self.test_run_id)) 
      self.logger.addHandler(handler) 

然後,當你在測試中做一個實例,請tr = TestRun(file_logs = False)

另一方面,正如評論中指出的,最好是簡單地創建日誌,然後在測試完成後刪除它們。

+0

我選擇這個作爲最好的答案,因爲如果我需要的話,我仍然可以獲得'logger'對象而不將它寫入文件。 – mkerins

0

這應該做的伎倆:

logging.getLogger(__name__).disabled = True

您的進口之後添加此行。

+0

不會得到錯誤的記錄器實例嗎?測試代碼中的'__name__'將與定義'TestRun'的地方不同。 –