[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