Nose has a bug - test names created by generators are not cached, so the error looks like it happened in the last test, not the actual test where it failed. I got around it following the solution in the bug report discussion, but it only works for names shown on stdout, not in the XML report (--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
The output of nose is as expected, something like
nice test name 0 ... ok
nice test name 1 ... ok
nice test name 2 ... ok
...
But the test names in XML are just 'testGenerator'.
...<testcase classname="example" name="testGenerator" time="0.000" />...
How can I change this so that the personalized test names are shown on both stdout and XML output?
I'm using nosetests version 1.1.2 and Python 2.6.6
You can add the following line.
testGenerator.__name__ = "nice test name %s" % i
Example:
This will result in the names you want.
If using nose and Eclipe's PyUnit:
which will cause the name to show up nicely in PyUnit as well.
As Ananth mentions, you can use this.
You can also use this instead
If your test class has arguments, I'd recommend currying them, as well as currying with_setup. Using lambda saves on the import, and I think it's a little cleaner. For example,
You can change the way that Nose names tests by adding a plugin that implements describeTest
You will then have to install this plugin, and enable it in the Nose invocation.