Нос Python: настройка атрибута описания для сгенерированных тестов

Я использую тестовые генераторы с носом. Я хотел бы иметь собственное описание для каждого сгенерированного теста.

В документация Nose говорится:

По умолчанию вывод имени теста для сгенерированного теста в подробном режиме будет именем функции или метода генератора, за которым следуют аргументы, переданные полученному вызываемому объекту. Если вы хотите показать другое имя теста, установите атрибут описания полученного вызываемого объекта.

Однако это не работает:

class TestGraphics:
   def test_all(self):                                                                                             
        for i, tc in enumerate(testcases):                                                                       
            self.run_sim.description = str(i)
            yield(self.run_sim, tc[0], tc[1]) 

Я получил:

AttributeError: 'method' object has no attribute 'description'

Как здесь установить атрибут описания для вызываемого объекта?


person PonyEars    schedule 20.05.2016    source источник
comment
попробуйте self.run_sim.__name__ = str(i)   -  person gipsy    schedule 20.05.2016
comment
Возможно, дубликат stackoverflow. ком/вопросы/24270342/   -  person Oleksiy    schedule 20.05.2016
comment
@Oleksiy Даже не близко: в вопросе не используется тестовый класс, а в ответе даже не используется генерация теста доходности.   -  person PonyEars    schedule 20.05.2016


Ответы (1)


Приведенные ниже обходные пути описаны здесь и здесь, кажется, работает.

from nose.tools import assert_true

class TestEven:

    def test_evens(self):
        for i in range(0, 5):
            yield self.check_even("check_even with {}".format(i)), i

    def check_even(self, desc):
        func = lambda n: assert_true(n % 2 == 0)
        func.description = desc
        return func

class TestEven:

    def test_evens(self):
        for i in range(0, 5):
            yield CheckEven(), i

class CheckEven:

    def __call__(self, n):
        self.description = "check_even with {}".format(n)
        assert n % 2 == 0

from functools import partial

class TestEven:

    def test_evens(self):
        for i in range(0, 5):
            f = partial(self.check_even, i)
            f.description = 'check_even with {}'.format(i)
            yield (f, )

    def check_even(self, n):
        assert n % 2 == 0
person sowa    schedule 23.05.2016
comment
Спасибо за подсказки, очень помогли! Я попробовал третий пример, так как он лучше всего соответствует парадигме моего класса, но проблема в том, что «я», переданное в check_even, не похоже на то, как если бы я вызывал его напрямую. Например, если я определяю def setUp(self): self.x = 2, то я не могу сослаться на self.x из check_even(), хотя у меня не возникнет проблем с этим, если check_even() был вызван непосредственно из выход, не проходя частичный. Есть идеи, что здесь происходит? - person PonyEars; 24.05.2016
comment
Используйте носовую фикстуру уровня класса, как в def setup_class(cls): вместо setUp():. - person sowa; 24.05.2016