[Checkins] SVN: zope.testrunner/branches/mgedmin-transaction-nanny/src/zope/testrunner/ Warn about tests that leave an unclean transaction behind them.

Marius Gedminas marius at pov.lt
Thu Sep 16 17:54:51 EDT 2010


Log message for revision 116472:
  Warn about tests that leave an unclean transaction behind them.
  
  I needed this feature very badly, and when I had it, I thought -- why not
  share it with the world?  It has no unit tests, though.
  

Changed:
  U   zope.testrunner/branches/mgedmin-transaction-nanny/src/zope/testrunner/feature.py
  U   zope.testrunner/branches/mgedmin-transaction-nanny/src/zope/testrunner/runner.py
  A   zope.testrunner/branches/mgedmin-transaction-nanny/src/zope/testrunner/transactions.py

-=-
Modified: zope.testrunner/branches/mgedmin-transaction-nanny/src/zope/testrunner/feature.py
===================================================================
--- zope.testrunner/branches/mgedmin-transaction-nanny/src/zope/testrunner/feature.py	2010-09-16 21:51:19 UTC (rev 116471)
+++ zope.testrunner/branches/mgedmin-transaction-nanny/src/zope/testrunner/feature.py	2010-09-16 21:54:50 UTC (rev 116472)
@@ -46,11 +46,11 @@
         """Executed once after a layer was run."""
         pass
 
-    def test_setup(self):
+    def before_test(self, test):
         """Executed once before each test."""
         pass
 
-    def test_teardown(self):
+    def after_test(self, test):
         """Executed once after each test."""
         pass
 

Modified: zope.testrunner/branches/mgedmin-transaction-nanny/src/zope/testrunner/runner.py
===================================================================
--- zope.testrunner/branches/mgedmin-transaction-nanny/src/zope/testrunner/runner.py	2010-09-16 21:51:19 UTC (rev 116471)
+++ zope.testrunner/branches/mgedmin-transaction-nanny/src/zope/testrunner/runner.py	2010-09-16 21:54:50 UTC (rev 116472)
@@ -45,6 +45,7 @@
 import zope.testrunner.debug
 import zope.testrunner.tb_format
 import zope.testrunner.shuffle
+import zope.testrunner.transactions
 
 
 PYREFCOUNT_PATTERN = re.compile('\[[0-9]+ refs\]')
@@ -188,6 +189,7 @@
                 zope.testrunner.garbagecollection.Threshold(self))
             self.features.append(
                 zope.testrunner.garbagecollection.Debug(self))
+        self.features.append(zope.testrunner.transactions.Transaction(self))
 
         self.features.append(zope.testrunner.find.Find(self))
         self.features.append(zope.testrunner.shuffle.Shuffle(self))
@@ -217,7 +219,8 @@
                 feature.layer_setup(layer)
             try:
                 self.ran += run_layer(self.options, layer_name, layer, tests,
-                                      setup_layers, self.failures, self.errors)
+                                      setup_layers, self.failures, self.errors,
+                                      self.features)
             except zope.testrunner.interfaces.EndRun:
                 self.failed = True
                 return
@@ -245,7 +248,7 @@
         self.failed = bool(self.import_errors or self.failures or self.errors)
 
 
-def run_tests(options, tests, name, failures, errors):
+def run_tests(options, tests, name, failures, errors, features):
     repeat = options.repeat or 1
     repeat_range = iter(range(repeat))
     ran = 0
@@ -281,6 +284,9 @@
             for test in tests:
                 if result.shouldStop:
                     break
+
+                for feature in features:
+                    feature.before_test(test)
                 result.startTest(test)
                 state = test.__dict__.copy()
                 try:
@@ -297,6 +303,8 @@
                         result.addSuccess(test)
                 finally:
                     result.stopTest(test)
+                for feature in features:
+                    feature.after_test(test)
                 test.__dict__.clear()
                 test.__dict__.update(state)
 
@@ -306,7 +314,11 @@
                 if result.shouldStop:
                     break
                 state = test.__dict__.copy()
+                for feature in features:
+                    feature.before_test(test)
                 test(result)
+                for feature in features:
+                    feature.after_test(test)
                 test.__dict__.clear()
                 test.__dict__.update(state)
 
@@ -350,7 +362,7 @@
 
 
 def run_layer(options, layer_name, layer, tests, setup_layers,
-              failures, errors):
+              failures, errors, features):
 
     output = options.output
     gathered = []
@@ -374,7 +386,7 @@
         errors.append((SetUpLayerFailure(layer), sys.exc_info()))
         return 0
     else:
-        return run_tests(options, tests, layer_name, failures, errors)
+        return run_tests(options, tests, layer_name, failures, errors, features)
 
 
 class SetUpLayerFailure(unittest.TestCase):

Added: zope.testrunner/branches/mgedmin-transaction-nanny/src/zope/testrunner/transactions.py
===================================================================
--- zope.testrunner/branches/mgedmin-transaction-nanny/src/zope/testrunner/transactions.py	                        (rev 0)
+++ zope.testrunner/branches/mgedmin-transaction-nanny/src/zope/testrunner/transactions.py	2010-09-16 21:54:50 UTC (rev 116472)
@@ -0,0 +1,47 @@
+##############################################################################
+#
+# Copyright (c) 2004-2008 Zope Foundation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""Transaction collection support.
+"""
+
+import sys
+
+import zope.testrunner.feature
+
+class Transaction(zope.testrunner.feature.Feature):
+
+    active = True
+
+    def before_test(self, test):
+        try:
+            import transaction
+        except ImportError:
+            self.had_resources = True
+            return
+        txn = transaction.get()
+        self.had_resources = bool(txn._resources)
+        if self.had_resources:
+            self.runner.options.output.info("Test %s received an unclean transaction:"
+                                             "\n  %r" % (test, txn._resources, ))
+
+    def after_test(self, test):
+        if self.had_resources:
+            return
+        import transaction
+        txn = transaction.get()
+        if txn._resources:
+            self.runner.options.output.error("Test %s left an unclean transaction:"
+                                             "\n  %r" % (test, txn._resources, ))
+            txn.abort()
+
+


Property changes on: zope.testrunner/branches/mgedmin-transaction-nanny/src/zope/testrunner/transactions.py
___________________________________________________________________
Added: svn:keywords
   + Id



More information about the checkins mailing list