Нос игнорирует тест с помощью специального декоратора
У меня есть несколько относительно сложных тестов интеграции в моем коде Python. Я упростил их с помощью специального декоратора, и я очень доволен результатом. Вот простой пример того, как выглядит мой декоратор:
def specialTest(fn):
def wrapTest(self):
#do some some important stuff
pass
return wrapTest
Вот какой может выглядеть тест:
class Test_special_stuff(unittest.TestCase):
@specialTest
def test_something_special(self):
pass
Это отлично работает и выполняется тестовым бегущем PyCharm без проблем. Однако, когда я запускаю тест из командной строки с помощью Nose, он пропускает любой тест с помощью декоратора @specialTest.
Я попытался назвать декоратор как testSpecial, поэтому он соответствует правилам по умолчанию, но мой параметр FN не передается.
Как я могу заставить Nose выполнить эти методы тестирования и обработать декоратор, как он предназначен?
Решение
Благодаря маджар, я получил эту работу, реструктурируя свой код, чтобы выглядеть так, используя functools.wraps и меняя имя обертки:
def specialTest(fn):
@wraps(fn)
def test_wrapper(self,*args,**kwargs):
#do some some important stuff
pass
return test_wrapper
class Test_special_stuff(unittest.TestCase):
@specialTest
def test_something_special(self):
pass
Ответы
Ответ 1
Если я правильно помню, нос загружает тест на основе их имен (функции, имя которых начинается с test_). В опубликованном фрагменте вы не копируете атрибут __name__
функции в вашей функции-обертки, поэтому имя возвращаемой функции wrapTest
, и нос решает, что это не тест.
Легкий способ скопировать атрибуты функции в новую - использовать functools.wraps
.