[Python-Dev] setUpClass and setUpModule in unittest

Michael Foord fuzzyman at voidspace.org.uk
Fri Feb 12 16:49:02 CET 2010


On 11/02/2010 18:11, Guido van Rossum wrote:
> On Tue, Feb 9, 2010 at 8:42 AM, Michael Foord<fuzzyman at voidspace.org.uk>  wrote:
>    
>> The next 'big' change to unittest will (may?) be the introduction of class
>> and module level setUp and tearDown. This was discussed on Python-ideas and
>> Guido supported them. They can be useful but are also very easy to abuse
>> (too much shared state, monolithic test classes and modules).
> [snip...]
>    
> The potential for abuse in and of itself should not be an argument
> against a feature; it must always be weighed against the advantages.
>    

The advantage of setUpClass and setUpModule is that they allow you to 
have shared fixtures shared between tests, essential for certain kinds 
of testing. A practical difficulty with setUpClass and setUpModule is 
that because the scope of the shared fixtures is fixed it makes it much 
harder to later refactor your tests - either into several classes or 
into several modules - when the tests grow.

My *hope* is that we provide a general solution, possibly based on all 
or part of Test Resources, with an easy mechanism for the setUpClass and 
setUpModule but also solves the more general case of sharing fixtures 
between tests. If that doesn't turn out to be possible then we'll go for 
a straight implementation of setUpClass / setUpModule. I'm hoping I can 
get this together in time for the PyCon sprints...

Here's a current minimal example of using Test Resources. It could be 
simplified further with helper functions and by some of the 
functionality moving into unittest itself. OptimisingTestSuite here 
ensures that the resource is created before first use (MyTempDir.make is 
called) and disposed of when finished with (MyTempDir.clean is called).

import shutil
import tempfile
import testresources

def load_tests(loader, tests, pattern):
# this step could be built into the standard loader
return testresources.OptimisingTestSuite(tests)

class MyTempDir(testresources.TestResource):
def make(self, dependency_resources):
return tempfile.mkdtemp()

def clean(self, resource):
shutil.rmtree(resource)

class MyTest(testresources.ResourcedTestCase):
resources = [('workdir', MyTempDir())]
def test_foo(self):
print self.workdir
def test_bar(self):
print self.workdir


Michael

-- 
http://www.ironpythoninaction.com/
http://www.voidspace.org.uk/blog

READ CAREFULLY. By accepting and reading this email you agree, on behalf of your employer, to release me from all obligations and waivers arising from any and all NON-NEGOTIATED agreements, licenses, terms-of-service, shrinkwrap, clickwrap, browsewrap, confidentiality, non-disclosure, non-compete and acceptable use policies (”BOGUS AGREEMENTS”) that I have entered into with your employer, its partners, licensors, agents and assigns, in perpetuity, without prejudice to my ongoing rights and privileges. You further represent that you have the authority to release me from any BOGUS AGREEMENTS on behalf of your employer.




More information about the Python-Dev mailing list