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