2009-11-10 75 views
16

當在命令行中運行nosetests,你如何指定「非忽略的警告應該被視爲錯誤?運行nosetests警告作爲錯誤?

默認情況下,警告打印,但不能算作故障:

[snip]/service/accounts/database.py:151: SADeprecationWarning: Use session.add() 
    self.session.save(state) 
[snip]/service/accounts/database.py:97: SADeprecationWarning: Use session.add() 
    self.session.save(user) 
............ 
---------------------------------------------------------------------- 
Ran 12 tests in 0.085s 

OK 

因爲我們不希望我們的代碼生成的警告,我不希望這種情況是OK

謝謝!

編輯: 理想情況下,我想要的是一個nosetests命令行選項,每個測試warnings.simplefilter('error')之前發出(並清除出來之後)。

涉及使用warnings模塊中的測試碼的任何解決方案似乎打敗點。我不想手動編輯每個測試模塊,將警告轉換爲錯誤。另外,我不希望每個測試模塊的作者都能夠忘記「打開」警告錯誤。

+0

您可以編寫[鼻插件](http://nose.readthedocs.org/en/latest/plugins/interface.html)來讀取和解析stderr。 – dbn

回答

0

我不覺得鼻子可以直接控制這一點:在發出警告時,警告模塊不引發異常。 warnings模塊可讓您控制應將哪些警告提示爲例外。

+0

好吧,鼻子不能,然而克林森的訣竅呢。順便說一句,'PYTHONWARNINGS =錯誤nosetests ...' –

9

nosetests是一個小的Python腳本。用編輯器打開它,並在第一行的末尾添加-W error。這告訴Python解釋器將警告轉換爲異常。

更簡單的方法是使用Python環境變量注入「將警告視爲錯誤」標誌:

PYTHONWARNINGS=error nosetests test/test_*.py --pdb 
+0

真棒,它做正確的事,即使複雜的運行,例如'nosetests -vx tests/*。py --pdb' –

3

通過@khinsen答案有很大幫助,但使nosetests的執行停止,如果它發出在測試發現期間發出警告(否則用戶不可見):「導入警告:不導入目錄'XXX':缺少__init__.py

此外,在導入模塊期間引發警告(與在測試)不應該被視爲錯誤。

我跟着@ DBW在編寫一個插件,它可以發現github上建議:https://github.com/Bernhard10/WarnAsError

鼻插件warnaserror將

旁邊configureoptions功能,該插件實現prepareTestRunner,它將取代

def prepareTestRunner(self, runner): 
    return WaETestRunner(runner) 

這個類存儲原始的TestRunner及其run - 方法調用ORI:由具有不同的運行方法的類默認的TestRunner ginal TestRunner的運行方法與warnings.simplefilter不同。

class WaETestRunner(object): 
    def __init__(self, runner): 
     self.runner=runner 
    def run(self, test): 
     with warnings.catch_warnings(): 
      warnings.simplefilter("error") 
      return self.runner.run(test) 
+1

你介意提供安裝和使用說明嗎? –