从命令行运行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 :(得分:9)
nosetests
是一个小型Python脚本。使用编辑器打开它,并在第一行的末尾添加-W error
。这告诉Python解释器将警告转换为异常。
更简单的是使用Python环境变量将“将警告视为错误”标记:
PYTHONWARNINGS=error nosetests test/test_*.py --pdb
答案 1 :(得分:3)
@khinsen的答案有很多帮助,但如果在测试发现过程中发出以下警告(用户不可见),则会停止执行nosetests:"导入警告:不导入目录& #39; XXX':缺少__init__.py
此外,在导入模块期间引发的警告(与测试期间提出的警告相反)不应视为错误。
我在编写插件时遵循了@ dbw的建议,可以找到一个github:https://github.com/Bernhard10/WarnAsError
在configure
和options
函数旁边,插件实现prepareTestRunner
,它用一个具有不同run方法的类替换默认的TestRunner:
def prepareTestRunner(self, runner):
return WaETestRunner(runner)
此类存储原始TestRunner及其run
- Method使用不同的warnings.simplefilter
调用原始TestRunner的run方法。
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)
答案 2 :(得分:0)
我认为鼻子不能直接控制它:警告模块在发出警告时不会引发异常。 warnings
模块使您可以控制应将哪些警告引发为异常。