[Checkins] SVN: zope.testing/branches/stub-testSetUp_in_layer/src/zope/testing/testrunner Implement layer.testSetUp and layer.testTearDown support

Stuart Bishop cvs-admin at zope.org
Fri Jun 16 08:02:16 EDT 2006


Log message for revision 68689:
  Implement layer.testSetUp and layer.testTearDown support

Changed:
  U   zope.testing/branches/stub-testSetUp_in_layer/src/zope/testing/testrunner-layers-api.txt
  U   zope.testing/branches/stub-testSetUp_in_layer/src/zope/testing/testrunner.py

-=-
Modified: zope.testing/branches/stub-testSetUp_in_layer/src/zope/testing/testrunner-layers-api.txt
===================================================================
--- zope.testing/branches/stub-testSetUp_in_layer/src/zope/testing/testrunner-layers-api.txt	2006-06-16 08:00:26 UTC (rev 68688)
+++ zope.testing/branches/stub-testSetUp_in_layer/src/zope/testing/testrunner-layers-api.txt	2006-06-16 12:02:13 UTC (rev 68689)
@@ -12,41 +12,44 @@
 Layers are generally implemented as classes using class methods.
 
 >>> class BaseLayer:
-...     @classmethod
 ...     def setUp(cls):
 ...         log('BaseLayer.setUp')
+...     setUp = classmethod(setUp)
 ...
-...     @classmethod
 ...     def tearDown(cls):
 ...         log('BaseLayer.tearDown')
+...     tearDown = classmethod(tearDown)
 ...
-...     @classmethod
 ...     def testSetUp(cls):
 ...         log('BaseLayer.testSetUp')
+...     testSetUp = classmethod(testSetUp)
 ...
-...     @classmethod
 ...     def testTearDown(cls):
 ...         log('BaseLayer.testTearDown')
+...     testTearDown = classmethod(testTearDown)
+...
 
 Layers can extend other layers. Note that they do not explicitly
 invoke the setup and teardown methods of other layers - the test runner
 does this for us in order to minimize the number of invokations.
 
 >>> class TopLayer(BaseLayer):
-...     @classmethod
 ...     def setUp(cls):
 ...         log('TopLayer.setUp')
+...     setUp = classmethod(setUp)
 ...
-...     @classmethod
 ...     def tearDown(cls):
 ...         log('TopLayer.tearDown')
+...     tearDown = classmethod(tearDown)
 ...
-...     @classmethod
 ...     def testSetUp(cls):
 ...         log('TopLayer.testSetUp')
+...     testSetUp = classmethod(testSetUp)
 ...
 ...     def testTearDown(cls):
 ...         log('TopLayer.testTearDown')
+...     testTearDown = classmethod(testTearDown)
+...
 
 Tests or test suites specify what layer they need by storing a reference
 in the 'layer' attribute.
@@ -158,7 +161,7 @@
 
 >>> report()
 BaseLayer.setUp
-BaseLayer.testSetup
+BaseLayer.testSetUp
 TestSpecifyingBaseLayer.setUp
 TestSpecifyingBaseLayer.test1
 TestSpecifyingBaseLayer.tearDown

Modified: zope.testing/branches/stub-testSetUp_in_layer/src/zope/testing/testrunner.py
===================================================================
--- zope.testing/branches/stub-testSetUp_in_layer/src/zope/testing/testrunner.py	2006-06-16 08:00:26 UTC (rev 68688)
+++ zope.testing/branches/stub-testSetUp_in_layer/src/zope/testing/testrunner.py	2006-06-16 12:02:13 UTC (rev 68689)
@@ -490,7 +490,7 @@
 
         if options.verbose > 0 or options.progress:
             print '  Running:'
-        result = TestResult(options, tests)
+        result = TestResult(options, tests, layer_name=name)
 
         t = time.time()
 
@@ -683,9 +683,14 @@
 
     max_width = 80
 
-    def __init__(self, options, tests):
+    def __init__(self, options, tests, layer_name=None):
         unittest.TestResult.__init__(self)
         self.options = options
+        # Calculate our list of relevant layers we need to call testSetUp
+        # and testTearDown on.
+        self.layers = []
+        if layer_name != 'unit':
+            gather_layers(layer_from_name(layer_name), self.layers)
         if options.progress:
             count = 0
             for test in tests:
@@ -728,7 +733,28 @@
 
         return ' ' + s[:room]
 
+    def testSetUp(self):
+        """A layer may define a setup method to be called before each
+        individual test.
+        """
+        for layer in reversed(self.layers):
+            if hasattr(layer, 'testSetUp'):
+                layer.testSetUp()
+
+    def testTearDown(self):
+        """A layer may define a teardown method to be called after each
+           individual test.
+           
+           This is useful for clearing the state of global
+           resources or resetting external systems such as relational
+           databases or daemons.
+        """
+        for layer in self.layers:
+            if hasattr(layer, 'testTearDown'):
+                layer.testTearDown()
+
     def startTest(self, test):
+        self.testSetUp()
         unittest.TestResult.startTest(self, test)
         testsRun = self.testsRun - 1
         count = test.countTestCases()
@@ -817,6 +843,7 @@
             sys.stdout.write('\r' + (' ' * self.last_width) + '\r')
 
     def stopTest(self, test):
+        self.testTearDown()
         if self.options.progress:
             self.last_width = self.test_width
         elif self.options.verbose > 1:



More information about the Checkins mailing list