Nose有一个bug - 生成器创建的测试名称没有被缓存,因此错误看起来像是在最后一次测试中发生的,而不是它失败的实际测试。我在错误报告讨论中的solution之后解决了这个问题,但它只适用于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
鼻子的输出是预期的,类似于
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
答案 0 :(得分:4)
您可以通过实现describeTest
的adding a plugin更改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)
然后您必须install this plugin,并在Nose调用中启用它。
答案 1 :(得分: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" />
答案 2 :(得分:1)
正如Ananth所提到的,你可以使用它。
testGenerator.__name__
您也可以使用此
testGenerator.compat_func_name
如果您的测试类有参数,我建议使用它们,以及cur_ 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
答案 3 :(得分:0)
如果使用鼻子和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中很好地显示。