Issue #10979. unittest stdout buffering now works for class and module fixtures.
diff --git a/Lib/unittest/suite.py b/Lib/unittest/suite.py
index c0ae2ae..633af5c 100644
--- a/Lib/unittest/suite.py
+++ b/Lib/unittest/suite.py
@@ -8,6 +8,11 @@
__unittest = True
+def _call_if_exists(parent, attr):
+ func = getattr(parent, attr, lambda: None)
+ func()
+
+
class BaseTestSuite(object):
"""A simple test suite that doesn't provide class or module shared fixtures.
"""
@@ -136,6 +141,7 @@
setUpClass = getattr(currentClass, 'setUpClass', None)
if setUpClass is not None:
+ _call_if_exists(result, '_setupStdout')
try:
setUpClass()
except Exception as e:
@@ -145,7 +151,8 @@
className = util.strclass(currentClass)
errorName = 'setUpClass (%s)' % className
self._addClassOrModuleLevelException(result, e, errorName)
-
+ finally:
+ _call_if_exists(result, '_restoreStdout')
def _get_previous_module(self, result):
previousModule = None
@@ -170,6 +177,7 @@
return
setUpModule = getattr(module, 'setUpModule', None)
if setUpModule is not None:
+ _call_if_exists(result, '_setupStdout')
try:
setUpModule()
except Exception, e:
@@ -178,6 +186,8 @@
result._moduleSetUpFailed = True
errorName = 'setUpModule (%s)' % currentModule
self._addClassOrModuleLevelException(result, e, errorName)
+ finally:
+ _call_if_exists(result, '_restoreStdout')
def _addClassOrModuleLevelException(self, result, exception, errorName):
error = _ErrorHolder(errorName)
@@ -201,6 +211,7 @@
tearDownModule = getattr(module, 'tearDownModule', None)
if tearDownModule is not None:
+ _call_if_exists(result, '_setupStdout')
try:
tearDownModule()
except Exception as e:
@@ -208,6 +219,8 @@
raise
errorName = 'tearDownModule (%s)' % previousModule
self._addClassOrModuleLevelException(result, e, errorName)
+ finally:
+ _call_if_exists(result, '_restoreStdout')
def _tearDownPreviousClass(self, test, result):
previousClass = getattr(result, '_previousTestClass', None)
@@ -223,6 +236,7 @@
tearDownClass = getattr(previousClass, 'tearDownClass', None)
if tearDownClass is not None:
+ _call_if_exists(result, '_setupStdout')
try:
tearDownClass()
except Exception, e:
@@ -231,6 +245,8 @@
className = util.strclass(previousClass)
errorName = 'tearDownClass (%s)' % className
self._addClassOrModuleLevelException(result, e, errorName)
+ finally:
+ _call_if_exists(result, '_restoreStdout')
class _ErrorHolder(object):