将`@ unittest.skipIf`与旧版本的Python一起使用

时间:2012-06-12 05:54:55

标签: python unit-testing decorator backport

使用unittest模块,我喜欢feature to skip tests,但它仅适用于Python 2.7 +。

例如,考虑test.py

import unittest
try:
    import proprietary_module
except ImportError:
    proprietary_module = None

class TestProprietary(unittest.TestCase):
    @unittest.skipIf(proprietary_module is None, "requries proprietary module")
    def test_something_proprietary(self):
        self.assertTrue(proprietary_module is not None)

if __name__ == '__main__':
    unittest.main()

如果我尝试使用早期版本的Python运行测试,则会收到错误:

Traceback (most recent call last):
  File "test.py", line 7, in <module>
    class TestProprietary(unittest.TestCase):
  File "test.py", line 8, in TestProprietary
    @unittest.skipIf(proprietary_module is None, "requries proprietary module")
AttributeError: 'module' object has no attribute 'skipIf'

有没有办法“欺骗”旧版本的Python来忽略unittest装饰器,并跳过测试?

3 个答案:

答案 0 :(得分:6)

unittest2是Python 2.7中添加到unittest测试框架的新功能的后端。它经过测试可以在Python 2.4 - 2.7上运行。

使用unittest2代替unittest只需更换      进口单位测试      同      import unittest2

参考:http://pypi.python.org/pypi/unittest2

答案 1 :(得分:4)

一般情况下,我建议不要使用unittest,因为它实际上并不是pythonic API。

在Python中进行测试的一个好框架是nose。您可以通过引发SkipTest例外来跳过测试,例如:

if (sys.version_info < (2, 6, 0)):
    from nose.plugins.skip import SkipTest
    raise SkipTest

这适用于Python 2.3 +

鼻子中有很多功能:

  • 您不需要课程。一个功能也可以是一个测试。
  • 装置的装饰器(设置,拆卸功能)。
  • 模块级别装置。
  • 期待异常的装饰者。
  • ...

答案 2 :(得分:2)

如何使用if声明?

if proprietary_module is None:   
    print "Skipping test since it requires proprietary module"
else:
    def test_something_proprietary(self):
        self.assertTrue(proprietary_module is not None)