2011-12-15 96 views
6

使用unittest進行測試,它會在每次測試完成後爲「ok」,「error」和「fail」打印「。」,「E」或「F」。我如何關閉它?我使用Python 2.7,這些打印來自內置的亞軍類。 覆蓋這些類聽起來非常困難,因爲它們都是嵌套的。在python unittest中打開一些打印

編輯: 我只想脫掉字符E。和F,因爲它們不會與我測試中的其他日誌同時出現。

+0

你爲什麼要這樣做?當然,看到測試的進展很有幫助嗎? – 2011-12-15 09:47:57

+0

在我的情況下,它增加了混淆,因爲我的測試並行運行,我打印1條日誌消息,並且這些測試日誌消息未與相應的「E」「F」或「。」同步。 。 – swan 2011-12-15 17:12:39

+0

如何在分離輸出流的獨立進程中運行這些測試? – 2013-02-06 14:03:32

回答

1

,取決於您所使用的單元測試框架(標準,鼻子......),你有多個方法來減少冗長:

python -m unittest -h 
... 
-q, --quiet  Minimal output 
... 
9

unittest輸出寫入標準錯誤流,它你可以管別的地方。在* nix框,這將有可能是這樣的:

python -m unittest some_module 2> /dev/null 

在Windows中,這應該是這樣的(感謝卡爾Knechtel):

python -m unittest some_module 2> NUL 

如果運行的Python測試,你可以簡單地更換stderr流這樣的:

import sys, os 

sys.stderr = open(os.devnull, 'w') 

... # do your testing here 

sys.stderr = sys.__stderr__ # if you still need the stderr stream 

由於您只是要關閉。,F,E符號的更新,因此您也可以通過覆蓋默認的類來創建自己的TestResult類。在我的情況(Python 2.6中),這將是這樣的:

import unittest 

class MyTestResult(unittest._TextTestResult): 
    def addSuccess(self, test): 
     TestResult.addSuccess(self, test) 
    def addError(self, test, err): 
     TestResult.addError(self, test, err) 
    def addFailure(self, test, err): 
     TestResult.addFailure(self, test, err) 

這有效地關閉了字符的打印,但保持默認功能。

現在我們還需要一個新的TestRunner類和重寫_makeResult方法:

class MyTestRunner(unittest.TextTestRunner): 
    def _makeResult(self): 
     return MyTestResult(self.stream, self.descriptions, self.verbosity) 

有了這個亞軍你現在可以享受一個日誌免費檢測。

只是說明:不幸的是,從命令行不可能這樣做。

5

有點遲到的反應,但有人可能會覺得它有用。 你可以轉動。 E和F關閉的詳細級別設置爲0:

testRunner = unittest.TextTestRunner(verbosity = 0) 

你仍然會有最終結果,並在在標準錯誤的測試結束時可能出現的錯誤/異常。

在Python 2.4和2.7中測試。