Python 是否将警告作为错误运行测试?

Python 是否将警告作为错误运行测试?,python,unit-testing,warnings,nose,Python,Unit Testing,Warnings,Nose,从命令行运行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.s

从命令行运行
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')
(并在测试之后清除)


任何涉及在测试代码中使用
警告
模块的解决方案似乎都不符合这一点。我不想手动编辑每个测试模块以将警告转换为错误。另外,我不希望每个测试模块的作者都能忘记“打开”警告错误。

我认为nose无法直接控制这一点:警告模块在发出警告时不会引发异常。
warnings
模块使您可以控制哪些警告应作为异常发出。

nosetests
是一个小型Python脚本。用编辑器打开它,并在第一行末尾添加
-W error
。这告诉Python解释器将警告转换为异常

更简单的方法是使用Python环境变量注入“将警告视为错误”标志:


@khinsen的回答很有帮助,但如果在测试发现期间发出以下警告(用户看不到该警告):“ImportWarning:不导入目录‘XXX’:缺少
\u init\uuuuuuuupy

此外,导入模块期间发出的警告(与测试期间发出的警告相反)不应视为错误

我按照@dbw的建议编写了一个插件,可以在github上找到:

鼻子插件警告错误 在
configure
options
函数旁边,插件实现了
prepareTestRunner
,其中它用一个具有不同运行方法的类替换默认的TestRunner:

def prepareTestRunner(self, runner):
    return WaETestRunner(runner)
此类存储原始TestRunner及其
run
-方法使用不同的
警告调用原始TestRunner的run方法。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)

您可能能够编写以读取和解析stderr。太棒了,即使在复杂的运行中,它也能做正确的事情,例如
nosets-vx tests/*.py--pdb
Well nose不能,但是khinsen的技巧做到了。顺便说一句,
PYTHONWARNINGS=error nosetests…
您介意提供安装和使用说明吗?
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)