8

Nose 有一个错误- 生成器创建的测试名称没有被缓存,所以错误看起来像是发生在最后一次测试中,而不是失败的实际测试。我按照错误报告讨论中的解决方案解决了这个问题,但它仅适用于标准输出上显示的名称,不适用于 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 输出中?

我正在使用鼻子测试版本 1.1.2 和 Python 2.6.6

4

4 回答 4

4

您可以通过添加实现 describeTest的插件来更改 Nose 命名测试的方式

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 调用中启用它。

于 2012-12-15T11:54:47.060 回答
1

您可以添加以下行。

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" />
于 2013-05-16T08:24:17.053 回答
1

正如 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
于 2014-02-14T22:42:40.660 回答
0

如果使用鼻子和 Ecipe 的 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 中也能很好地显示出来。

生成的测试名称

于 2014-05-15T17:18:24.403 回答