С помощью `@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
В общем, я бы рекомендовал не использовать 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)