[Python-Dev] Unit Test Guide

Jonathan Lange jml at mumak.net
Thu Feb 21 23:21:15 CET 2008


On Fri, Feb 22, 2008 at 2:43 AM, Giampaolo Rodola' <gnewsg at gmail.com> wrote:
> On 21 Feb, 12:30, "Virgil Dupras" <hs... at hardcoded.net> wrote:
>  > Hi devs,
>  >
>
>
> > Specifically, I'd like to know about files managements in tests. Is
>  > every test expected to clean after itself, or is there an automatic
>  > cleanup mechanism in place?
>
>  I have usually seen a lot of tests implemented like this:
>
>
>  from test.test_support import TESTFN, unlink
>  import unittest
>
>  class TestCase(unittest.TestCase):
>
>     def setUp(self):
>         self.file = None
>
>     def tearDown(self):
>         if self.file is not None:
>             self.file.close()
>         unlink(TESTFN)
>
>     def test_something(self):
>         self.file = open(TESTFN, 'r')
>         ...
>

This is a little off-topic but FWIW, bzrlib.tests.TestCase and
Twisted's TestCase have a nice helper method called 'addCleanup' that
adds a nullary callable to a stack of callable that get popped off and
run at the start of tearDown.

That would allow your example to be rewritten as:


from test.test_support import TESTFN, unlink
import unittest

class TestCase(unittest.TestCase):

   def open_file(self, filename, mode):
       opened_file = open(filename, mode)
       def close_and_delete():
           opened_file.close()
           unlink(filename)
       self.addCleanup(close_and_delete)
       return opened_file

   def test_something(self):
       file = self.open_file(TESTFN, 'r')
       ...

This isn't any shorter, but now you can open as many files as you
want. It also keeps clutter out of setUp and tearDown.

jml


More information about the Python-Dev mailing list