运行单元测试时没有弃用警告

时间:2014-08-26 13:02:02

标签: python python-2.7 python-unittest deprecation-warning

运行单元测试时,我希望看到弃用警告。看来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

没有弃用警告。所以问题是;我在这做错了什么?

2 个答案:

答案 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)中,可以修改解释器以包含环境变量。这样,它仅对使用该解释器的项目启用。

pydev interpreter config