[Python-Dev] setUpClass and setUpModule in unittest (original) (raw)

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