2009-11-10 34 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

你介意提供安装和使用说明吗? –