On 11/02/2010 18:11, Guido van Rossum wrote:
On Tue, Feb 9, 2010 at 8:42 AM, Michael Foord<fuzzy...@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.


_______________________________________________
Python-Dev mailing list
Python-Dev@python.org
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com

Reply via email to