2010-07-27 204 views
8

我想使用python日誌記錄模塊記錄unittest的所有輸出,以便我可以將它合併到我正在編寫的測試框架中。這樣做的目標是使用兩組輸出來運行測試,一組輸出告訴測試用例步驟和更多的調試級別輸出,以便在事情出錯時我們儘可能多地提供信息。輸出將被放置到兩個文件中,一個可以發送給人們,另一個可以保存以防發生故障。我注意到TextTestRunner可以使用流,這可以用於日誌記錄模塊嗎?我正在計劃使用Python 2.7中的一些新功能。如何使用unittest模塊在python中使用日誌模塊?

回答

1

你可以,但我不確定這是你最好的方法。

對於這種方法,您可以:

  1. 實例化可以通過TextTestRunner使用的內存流。這是io.StringIO幾乎完美的東西,除了它僅適用於Unicode輸入,並且我不確定TextTestRunner是否將Unicode正確寫入流。你的另一種選擇是編寫你自己的內存流來滿足你的目的,也許用編碼器包裝StringIO

  2. 創建您自己的TextTestRunner並使用此內存流進行初始化。

  3. 創建一個從流中讀取並將其寫入日誌的類。

這可能是簡單的:

class StreamLogger(object): 
    def __init__(self, input_stream, output_logger): 
     self.input_stream = input_stream 
     self.output_logger 
    def run(self): 
     while True: 
      line = input_stream.readline() 
      if not line: 
       break 
      output_logger.error(line) 

問題這種方法:

  • 你沒有太多的如果在指導TextTestRunner輸出的不同部分,以不同的任何靈活性日誌級別。
  • TextTestRunner,如果配置錯誤,會寫一堆你可能不想要的東西。默認的詳細程度爲1,這將在測試時寫入進度點......這可能只會在日誌記錄輸出中獲得。
  • 如果你這樣天真地做到這一點,只有在你將所有輸出寫入流之後,纔會調用stream_logger.run()。因此,您不會實時獲得您的日誌輸出,並且您的日誌記錄時間戳將毫無用處。例如,你可以通過產生一個單獨的線程來解決這個問題,例如,你需要選擇/滾動一個可以同時處理一個讀寫器線程的流,或者分叉一個進程並且丟棄內存中的流,或者相對複雜的東西。

的做法我反而建議是:放棄流和簡單的滾你自己的測試啓動 - 所謂的,也就是說,LoggingTestRunner - 在正是你想要的方式輸出寫入測試輸出到記錄器。這可以讓你避免所有這三個問題。

+0

謝謝。這聽起來像我需要做的事情,我需要做的其他事情。 – user197674 2010-07-27 21:27:42

相關問題