Нос игнорирует тест с пользовательским декоратором - PullRequest
25 голосов
/ 11 октября 2011

У меня есть несколько довольно сложных интеграционных тестов в моем коде 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 выполнить эти тестовые методы и обработать декоратор так, как он предназначен?


РЕШЕНИЕ

Благодаря madjar, я получил эту работу, реструктурировав мой код, чтобы он выглядел следующим образом, используя functools.wraps и изменив имя оболочки:

from functools import 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 Ответ

24 голосов
/ 11 октября 2011

Если я правильно помню, нос загружает тест, основываясь на их именах (функции, имя которых начинается с test_). В размещенном вами фрагменте вы не копируете атрибут __name__ функции в своей функции-обертке, поэтому возвращаемое имя функции - wrapTest, а нос решает, что это не тест.

Простой способ скопировать атрибуты функции в новый - использовать functools.wraps.

...