改变由鼻试验发生器产生的测试名字(Change names of tests created by

2019-06-25 17:46发布

鼻子有一个错误 -通过发电机而创建的测试名称没有缓存,所以错误看起来发生在最后的测试,而不是实际的测试它失败了。 我下面有它周围的解决方案中的bug报告的讨论,但它仅适用于在标准输出上显示的名字,而不是在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

鼻子的输出如预期,像

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" />...

我怎样才能改变这种做法,在标准输出和XML输出显示的个性化测试的名字呢?

我使用nosetests 1.1.2版和Python 2.6.6

Answer 1:

你可以改变的方式,鼻名测试通过添加插件实现describeTest

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)

然后,您必须安装这个插件 ,并在鼻子调用启用它。



Answer 2:

您可以添加以下行。

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" />


Answer 3:

作为Ananth提到,您可以使用此。

testGenerator.__name__

你也可以用这个代替

testGenerator.compat_func_name

如果您的测试类有争论,我建议他们讨好,以及钻营with_setup。 使用lambda对进口的扑救,我认为这是一个有点清洁。 例如,

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


Answer 4:

如果使用鼻的Eclipe的的PyUnit:

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很好地显示为好。



文章来源: Change names of tests created by nose test generators