summaryrefslogtreecommitdiff
path: root/lib/testtools/testtools/testcase.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/testtools/testtools/testcase.py')
-rw-r--r--lib/testtools/testtools/testcase.py19
1 files changed, 16 insertions, 3 deletions
diff --git a/lib/testtools/testtools/testcase.py b/lib/testtools/testtools/testcase.py
index 959c129691..573cd84dc2 100644
--- a/lib/testtools/testtools/testcase.py
+++ b/lib/testtools/testtools/testcase.py
@@ -5,6 +5,7 @@
__metaclass__ = type
__all__ = [
'clone_test_with_new_id',
+ 'MultipleExceptions',
'TestCase',
'skip',
'skipIf',
@@ -60,6 +61,13 @@ except ImportError:
"""
+class MultipleExceptions(Exception):
+ """Represents many exceptions raised from some operation.
+
+ :ivar args: The sys.exc_info() tuples for each exception.
+ """
+
+
class TestCase(unittest.TestCase):
"""Extensions to the basic TestCase.
@@ -188,9 +196,14 @@ class TestCase(unittest.TestCase):
except KeyboardInterrupt:
raise
except:
- exc_info = sys.exc_info()
- self._report_traceback(exc_info)
- last_exception = exc_info[1]
+ exceptions = [sys.exc_info()]
+ while exceptions:
+ exc_info = exceptions.pop()
+ if exc_info[0] is MultipleExceptions:
+ exceptions.extend(exc_info[1].args)
+ continue
+ self._report_traceback(exc_info)
+ last_exception = exc_info[1]
return last_exception
def addCleanup(self, function, *arguments, **keywordArguments):