运行单元测试时,我希望看到弃用警告。看来since Python 2.7 deprecation warnings are silenced。我将从页面引用:
对于Python 2.7,我们做出了一项政策决定,默认情况下仅限开发人员感兴趣的警告。除非另有要求,否则现在会忽略DeprecationWarning及其后代,从而阻止用户看到应用程序触发的警告。这个变化也是在成为Python 3.2的分支中进行的。 (讨论stdlib-sig并在问题7319中进行。)
稍后看起来好像我应该在运行unittests时看到弃用警告:
unittest模块在运行测试时也会自动重新启用弃用警告。
嗯..简单地说,它对我不起作用,所以我一定做错了。我已经使用以下代码进行了测试:
import warnings
import unittest
def spam():
warnings.warn('test', DeprecationWarning, stacklevel=2)
return 'spam'
class Eggs(object):
def __init__(self):
self.spam = spam()
class Test(unittest.TestCase):
def test_warn(self):
eggs = Eggs()
self.assertEqual('spam', eggs.spam)
然后我运行代码(保存在spam.py
中):
python -m 'unittest' spam
这给了我以下输出:
.
----------------------------------------------------------------------
Ran 1 test in 0.001s
OK
没有弃用警告。所以问题是;我在这做错了什么?
答案 0 :(得分:4)
看起来文档错误 - 在2.7中,unittest不会重新启用弃用警告。
>>> import warnings
>>> from pprint import pprint
>>> pprint(warnings.filters)
[('ignore', None, <type 'exceptions.DeprecationWarning'>, None, 0),
('ignore', None, <type 'exceptions.PendingDeprecationWarning'>, None, 0),
('ignore', None, <type 'exceptions.ImportWarning'>, None, 0),
('ignore', None, <type 'exceptions.BytesWarning'>, None, 0)]
>>> import unittest
>>> pprint(warnings.filters)
[('ignore', None, <type 'exceptions.DeprecationWarning'>, None, 0),
('ignore', None, <type 'exceptions.PendingDeprecationWarning'>, None, 0),
('ignore', None, <type 'exceptions.ImportWarning'>, None, 0),
('ignore', None, <type 'exceptions.BytesWarning'>, None, 0)]
... unittest.py
中没有任何内容我看到哪些重新启用DeprecationWarning
。
您当然可以自己启用它们:
warnings.simplefilter('always', DeprecationWarning)
或者在命令行上:
$ python -Wd -m 'unittest' spam
spam.py:10: DeprecationWarning: test
self.spam = spam()
.
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK
或者将装饰器应用于您的每个unittest.TestCase
函数,以便仅为测试启用DeprecationWarning
:
import warnings
import unittest
def enable_DeprecationWarning(fn):
def _wrapped(*args, **kwargs):
with warnings.catch_warnings():
warnings.simplefilter('always', DeprecationWarning)
return fn(*args, **kwargs)
return _wrapped
def spam():
warnings.warn('test', DeprecationWarning, stacklevel=2)
return 'spam'
class Eggs(object):
def __init__(self):
self.spam = spam()
class Test(unittest.TestCase):
@enable_DeprecationWarning
def test_warn(self):
eggs = Eggs()
self.assertEqual('spam', eggs.spam)
if __name__ == '__main__':
unittest.main()
命令行选项可能是单元测试的最佳选择,因为它不需要更改代码。
答案 1 :(得分:1)
由于我使用Eclipse进行Python开发,因此我决定使用与建议不同的解决方案。也可以使用环境变量启用警告。如果环境变量PYTHONWARNINGS
设置为default
,则会显示弃用警告。
在Eclipse(PyDev)中,可以修改解释器以包含环境变量。这样,它仅对使用该解释器的项目启用。