[TIP] TestCase.debug doesn't run tearDown in the event of an error?

Michael Foord fuzzyman at voidspace.org.uk
Wed Jul 28 07:02:52 PDT 2010


On 28/07/2010 14:59, Chris Withers wrote:
> Michael Foord wrote:
>>> from unittest import TestCase
>>>
>>> class Tests(TestCase):
>>>
>>>   def setUp(self):
>>>     print "setUp"
>>>
>>>   def tearDown(self):
>>>     print "tearDown"
>>>
>>>   def test_method(self):
>>>     raise ValueError('foo')
>>>
>>> tests = Tests('test_method')
>>>
>>> tests.debug()
>>>
>>> When test_method doesn't raise an exception, the tearDown is run.
>>> However, in the above example, the tearDown is not run.
>>> This is at odds with the normal unit test running experience.
>>> Why does debug behave differently in this respect?
>>>
>>> If it helps, this is on Python 2.5.2.
>>
>> This was a design decision when TestCase.debug was first implemented 
>> - it simply stops on exceptions.
>
> Okay, the above is simplified from a unit test that tests a base test, 
> so the whole test case definition and call to debug are actually 
> inside a method of a test case.
>
> Is there a better method that debug I should be using that more 
> carefully mimics the behaviour of real test case use? ie: throws any 
> exceptions that occur in a test case, but runs both setUp and tearDown 
> even when they occur?

Well, you could just call it yourself.

test = TheTestCase('methodName')
try:
     test.debug()
except Exception:
     test.tearDown()
     raise

A bit ungainly, sorry. I'm not really a fan of the debug method *anyway* 
but calling the tearDown on fail / exception would be a big semantic change.

Michael

>
> cheers,
>
> Chris
>


-- 
http://www.ironpythoninaction.com/




More information about the testing-in-python mailing list