Добавьте нос @attr к имени теста

Я могу настроить тесты носа для запуска с тегом @attr. Теперь мне интересно узнать, могу ли я добавить в конец названия теста тег @attr? То, что мы пытаемся сделать, - это добавить тег, если наши тесты сталкиваются с проблемой, и мы записываем для нее дефект, а затем мы указываем номер дефекта как тег @attr. Затем, когда мы запустим, мы могли легко определить, какие тесты имеют открытые дефекты.

Просто интересно, возможно ли это вообще, и куда пойти посмотреть, как это настроить?

РЕДАКТИРОВАТЬ РЕЗУЛЬТАТЫ, РАБОТАЯ С ОТВЕТОМ:введите описание изображения здесьвведите описание изображения здесь

Результаты теста:введите описание изображения здесь

Так что я вроде знаю, что происходит, если у меня есть @fancyattr() на уровне класса он поднимает его и меняет название класса. Когда я ставлю @fancyattr() на уровне теста это не меняет название теста, что мне нужно для этого.

Например - Меняет имя класса:

@dms_attr('DMSTEST')
@attr('smoke_login', 'smoketest', priority=1)
class TestLogins(BaseSmoke):

"""
Just logs into the system and then logs off
"""

def setUp(self):
    BaseSmoke.setUp(self)

def test_login(self):
    print u"I can login -- taking a nap now"
    sleep(5)
    print u"Getting off now"

def tearDown(self):
    BaseSmoke.tearDown(self)

Это то, что мне нужно, и оно не работает:

@attr('smoke_login', 'smoketest', priority=1)
class TestLogins(BaseSmoke):

    """
    Just logs into the system and then logs off
    """

    def setUp(self):
        BaseSmoke.setUp(self)

    @dms_attr('DMSTEST')  
    def test_login(self):
        print u"I can login -- taking a nap now"
        sleep(5)
        print u"Getting off now"

    def tearDown(self):
        BaseSmoke.tearDown(self)

Обновлен скриншот с тем, что я вижу с __doc__:

введите описание изображения здесь

1 ответ

Решение

Вот как это сделать с атрибутами типа args:

rename_test.py:

import unittest 
from nose.tools import set_trace

def fancy_attr(*args, **kwargs):
    """Decorator that adds attributes to classes or functions
    for use with the Attribute (-a) plugin. It also renames functions!
    """
    def wrap_ob(ob):
        for name in args:
            setattr(ob, name, True)
            #using __doc__ instead of __name__ works for class methods tests
            ob.__doc__ = '_'.join([ob.__name__, name])
            #ob.__name__ = '_'.join([ob.__name__, name])

        return ob

    return wrap_ob


class TestLogins(unittest.TestCase):
    @fancy_attr('slow')
    def test_method():
        assert True


@fancy_attr('slow')
def test_func():
    assert True

Выполнение теста:

$ nosetests rename_test.py -v
test_method_slow ... ok
test_func_slow ... ok

----------------------------------------------------------------------
Ran 2 tests in 0.003s

OK

РЕДАКТИРОВАТЬ: для работы отчетов xunit, переименование теста должно быть выполнено до запуска теста. Вы можете сделать это при импорте, вот непроверенный хак, показывающий, как это сделать:

rename_test.py:

import unittest 

def fancy_attr(*args, **kwargs):
    """Decorator that adds attributes to classes or functions
    for use with the Attribute (-a) plugin. It also renames functions!
    """
    def wrap_ob(ob):
        for name in args:
            setattr(ob, name, True)
            ob.__doc__ = '_'.join([ob.__name__, name])

        return ob

    return wrap_ob


class TestLogins(unittest.TestCase):
    @fancy_attr('slow')
    def test_method(self):
        assert True


def make_name(orig, attrib):
    return '_'.join([orig, attrib])

def rename(cls):
    methods = []
    for key in cls.__dict__:
        method = getattr(cls, key)
        if method:
            if hasattr(cls.__dict__[key], '__dict__'):
                if 'slow' in cls.__dict__[key].__dict__:
                    methods.append(key)

    print methods

    for method in methods:
        setattr(cls, make_name(method, 'slow'),  cls.__dict__[key])
        delattr(cls, method)


rename(TestLogins)

@fancy_attr('slow')
def test_func():
    assert True
Другие вопросы по тегам