Изменение имен тестов, созданных генераторами носовых тестов

У носа есть имена ошибок – тестовые имена, созданные генераторами, не кэшируются, поэтому ошибка выглядит так, как в последнем тесте, а не в фактическом тесте, где она не удалась. Я обошел его после решения в обсуждении отчета об ошибке, но он работает только для имен, показанных на stdout, а не в отчете XML (–with-xunit)

from functools import partial, update_wrapper def testGenerator(): for i in range(10): func = partial(test) # make decorator with_setup() work again update_wrapper(func, test) func.description = "nice test name %s" % i yield func def test(): pass 

Выход носа такой, как ожидалось, что-то вроде

  • Обработка исключений в Python Behave Testing framework
  • Список всех тестов, найденных Nosetest
  • Могу ли я ограничить вывод покрытия носа в каталог (а не пакет)?
  • Проблемы с использованием носа в virtualenv
  •  nice test name 0 ... ok nice test name 1 ... ok nice test name 2 ... ok ... 

    Но имена тестов в XML – это просто «testGenerator».

     ...<testcase classname="example" name="testGenerator" time="0.000" />... 

    Как я могу изменить это, чтобы персонализированные имена тестов отображались как на выводах stdout, так и на XML?

    Я использую nosetests версии 1.1.2 и Python 2.6.6

  • Список всех тестов, найденных Nosetest
  • Обработка исключений в Python Behave Testing framework
  • Могу ли я ограничить вывод покрытия носа в каталог (а не пакет)?
  • Проблемы с использованием носа в virtualenv
  • 4 Solutions collect form web for “Изменение имен тестов, созданных генераторами носовых тестов”

    Вы можете изменить способ тестирования имен носа, добавив плагин, который реализует описание

     from nose.plugins import Plugin class CustomName(Plugin): "Change the printed description/name of the test." def describeTest(self, test): return "%s:%s" % (test.test.__module__, test.test.description) 

    Затем вам нужно будет установить этот плагин и включить его в вызове Nose.

    Вы можете добавить следующую строку.

    testGenerator.__name__ = "nice test name %s" % i

    Пример:

     from functools import partial, update_wrapper def testGenerator(): for i in range(10): func = partial(test) # make decorator with_setup() work again update_wrapper(func, test) func.description = "nice test name %s" % i testGenerator.__name__ = "nice test name %s" % i yield func def test(): pass 

    Это приведет к именам, которые вы хотите.

     <testsuite name="nosetests" tests="11" errors="0" failures="0" skip="0"><testcase classname="sample" name="nice test name 0" time="0.000" /> 

    Как упоминает Анант, вы можете использовать это.

     testGenerator.__name__ 

    Вы также можете использовать это вместо

     testGenerator.compat_func_name 

    Если у вашего тестового класса есть аргументы, я бы рекомендовал их currying, а также currying with_setup. Использование лямбда экономит на импорте, и я думаю, что это немного чище. Например,

     from nose.tools import with_setup def testGenerator(): for i in range(10): func = with_setup(set_up, tear_down)(lambda: test(i)) func.description = "nice test name %s" % i testGenerator.compat_func_name = func.description yield func def test(i): pass def set_up(): pass def tear_down(): pass 

    При использовании носа и PyUnit Eclipe:

     import nose class Test(object): CURRENT_TEST_NAME = None def test_generator(self): def the_test(*args,**kwargs): pass for i in range(10): # Set test name Test.CURRENT_TEST_NAME = "TestGenerated_%i"%i the_test.description = Test.CURRENT_TEST_NAME # Yield generated test yield the_test,i # Set the name of each test generated test_generator.address = lambda arg=None:(__file__, Test, Test.CURRENT_TEST_NAME) 

    что приведет к тому, что имя будет хорошо отображаться в PyUnit.

    Сгенерированные имена тестов

    Python - лучший язык программирования в мире.