]> granicus.if.org Git - python/commitdiff
Changed TestResult to store only the text representation of an error.
authorSteve Purcell <steve@pythonconsulting.com>
Thu, 6 Sep 2001 08:24:40 +0000 (08:24 +0000)
committerSteve Purcell <steve@pythonconsulting.com>
Thu, 6 Sep 2001 08:24:40 +0000 (08:24 +0000)
This patch is similar to that proposed by Jeremy. The proposed patch altered
the interface of TestResult such that it would be passed the error
information as a string rather than an exc_info() tuple.

The implemented change leaves the interface untouched so that TestResults
are still passed the tracebacks, but stor them in stringified form for
later reporting.

Notes:
- Custom subclasses of TestResult written by users should be unaffected.
- The existing 'unittestgui.py' will still work with this module after the
  change.
- Support can later be added to pop into the debugger when an error occurs;
  this support should be added to a TestRunner rather than to TestCase itself,
  which this change will enable.

(Jeremy, Fred, Guido: Thanks for all the feedback)

Lib/unittest.py

index 480e825d58072a40cff85cfd6d8f2b4af7ba0290..9aa79b31d21f403b1ba27a90474ffac688a2697a 100644 (file)
@@ -16,7 +16,7 @@ Simple usage:
         def testAdd(self):  ## test method names begin 'test*'
             self.assertEquals((1 + 2), 3)
             self.assertEquals(0 + 1, 1)
-        def testMultiply(self);
+        def testMultiply(self):
             self.assertEquals((0 * 10), 0)
             self.assertEquals((5 * 8), 40)
 
@@ -67,8 +67,8 @@ class TestResult:
 
     Each instance holds the total number of tests run, and collections of
     failures and errors that occurred among those test runs. The collections
-    contain tuples of (testcase, exceptioninfo), where exceptioninfo is a
-    tuple of values as returned by sys.exc_info().
+    contain tuples of (testcase, exceptioninfo), where exceptioninfo is the
+    formatted traceback of the error that occurred
     """
     def __init__(self):
         self.failures = []
@@ -85,12 +85,15 @@ class TestResult:
         pass
 
     def addError(self, test, err):
-        "Called when an error has occurred"
-        self.errors.append((test, err))
+        """Called when an error has occurred. 'err' is a tuple of values as
+        returned by sys.exc_info().
+        """
+        self.errors.append((test, self._exc_info_to_string(err)))
 
     def addFailure(self, test, err):
-        "Called when a failure has occurred"
-        self.failures.append((test, err))
+        """Called when an error has occurred. 'err' is a tuple of values as
+        returned by sys.exc_info()."""
+        self.failures.append((test, self._exc_info_to_string(err)))
 
     def addSuccess(self, test):
         "Called when a test has completed successfully"
@@ -104,6 +107,10 @@ class TestResult:
         "Indicates that the tests should be aborted"
         self.shouldStop = 1
 
+    def _exc_info_to_string(self, err):
+        """Converts a sys.exc_info()-style tuple of values into a string."""
+        return string.join(apply(traceback.format_exception, err), '')
+
     def __repr__(self):
         return "<%s run=%i errors=%i failures=%i>" % \
                (self.__class__, self.testsRun, len(self.errors),
@@ -575,9 +582,7 @@ class _TextTestResult(TestResult):
             self.stream.writeln(self.separator1)
             self.stream.writeln("%s: %s" % (flavour,self.getDescription(test)))
             self.stream.writeln(self.separator2)
-            for line in apply(traceback.format_exception, err):
-                for l in string.split(line,"\n")[:-1]:
-                    self.stream.writeln("%s" % l)
+            self.stream.writeln("%s" % err)
 
 
 class TextTestRunner: