[TIP] RFC: Post-assertRaises assertions WAS: ANN: unittest2 0.4.0 Release
exarkun at twistedmatrix.com
exarkun at twistedmatrix.com
Fri Apr 9 06:24:53 PDT 2010
On 01:10 pm, olemis at gmail.com wrote:
>On Thu, Apr 8, 2010 at 5:42 PM, Michael Foord
><michael at voidspace.org.uk> wrote:
>>Hello all,
>
>:o)
>>I'm pleased to announce the release of version 0.4.0 of unittest2.
>[...]
>>
>>For full details of all the new features, see my blog entry:
>>
>>*
>>http://www.voidspace.org.uk/python/weblog/arch_d7_2010_04_03.shtml#e1171
>
>I wanted to know if you have considered support for writing assertions
>targeting the exception object been raised . In my experience that is
>very helpful when testing some kind of systems. For instance, in Trac
>XmlRpcPlugin (<=0.1.6, current trunk ;o) you can find many tests
>(actually all TCs checking for error conditions ;o) like this
>
>Therefore, we're recently considering [1]_ (not committed yet ;o) to
>adopt this style
>
>{{{
>#!python
>
>class TracRpcTestCase(unittest.TestCase):
> # Further code omitted ;o)
> def assertRaises(self, excClass, callableObj, *args, **kwargs):
> """Enhanced assertions to detect exceptions."""
> try:
> callableObj(*args, **kwargs)
> except excClass, e:
> return e
> except self.failureException :
> raise
> except Exception, e :
> if hasattr(excClass, '__name__'): excName =
>excClass.__name__
> else: excName = str(excClass)
>
> if hasattr(e, '__name__'): excMsg = e.__name__
> else: excMsg = str(e)
>
> raise self.failureException("\n\nExpected %s\n\nGot %s :
>%s" % (
> excName, e.__class__.__name__,
>excMsg))
> else:
> if hasattr(excClass,'__name__'): excName =
>excClass.__name__
> else: excName = str(excClass)
> raise self.failureException, "Expected %s\n\nNothing
>raised" % excName
Twisted Trial also includes an assertRaises like this. It has worked
well for many years in a wide variety of contexts.
Guido seemed to veto the API (<http://mail.python.org/pipermail/python-
dev/2008-April/078726.html>):
Hm. I've got to say that returning the exception object is, um, an odd
API in the set of unittest APIs. I can see how it's sometimes more
powerful, but I'd say that in many cases assertRaisesWithMessage will
be easier to write and read. (And making it a regex match would be
even cooler.)
IMHO, the (lack of) reasoning here is bogus. In fact, even Guido seems
to have forgotten that he doesn't like it
(<http://bugs.python.org/issue2578#msg84622>):
Antoine Pitrou <pitrou at free.fr> added the comment:
> Wouldn't it be simpler to make assertRaises return the exception and
let
> the calling code match it as it feels like?
Hm, that sounds awfully familiar. I can't recall if there was ever a
good reason not to do this.
Jean-Paul
More information about the testing-in-python
mailing list