Использование `@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 и пропустить тест?

Ответ 1

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

Чтобы использовать unittest2 вместо unittest, просто замените    import unittest    с    import unittest2

Ссылка: http://pypi.python.org/pypi/unittest2

Ответ 2

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

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

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

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

В носу много функций:

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

Ответ 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)