С помощью `@unittest.skipIf ' со старыми версиями Python

С unittest модуль, мне нравится , чтобы пропустить тесты, но он доступен только в 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 ответов


unittest2-это backport новых функций, добавленных в unittest Testing framework в Python 2.7. Он протестирован для работы на языке Python 2.4 - 2.7.

использовать unittest2 вместо unittest просто заменить импорт unittest с импорт unittest2

Ref:http://pypi.python.org/pypi/unittest2


В общем, я бы рекомендовал не использовать unittest потому что на самом деле это не питонический API.

хорошей основой для тестирования в Python является nose. Вы можете пропустить тесты, подняв SkipTest исключения, например:

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

это работает для Python 2.3+

есть гораздо больше возможностей в носу:

  • вам не нужны классы. Функция тоже может быть тестом.
  • декоратор для крепления (установки, функции демонтажа).
  • приспособления уровня модуля.
  • декоратор для ожидания исключения.
  • ...

Как насчет использования 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)