Merged revisions 78130 via svnmerge from

svn+ssh://pythondev@svn.python.org/python/trunk

........
  r78130 | michael.foord | 2010-02-10 14:25:12 +0000 (Wed, 10 Feb 2010) | 1 line

  Issue 7893 and Issue 7588
........
This commit is contained in:
Michael Foord 2010-02-10 15:51:42 +00:00
parent 99f69ee7a1
commit 34c9462d71
7 changed files with 107 additions and 46 deletions

View file

@ -60,4 +60,7 @@ from .suite import TestSuite
from .loader import (TestLoader, defaultTestLoader, makeSuite, getTestCaseNames,
findTestCases)
from .main import TestProgram, main
from .runner import TextTestRunner
from .runner import TextTestRunner, TextTestResult
# deprecated
_TextTestResult = TextTestResult

View file

@ -229,18 +229,15 @@ class TestCase(object):
return result.TestResult()
def shortDescription(self):
"""Returns both the test method name and first line of its docstring.
"""Returns a one-line description of the test, or None if no
description has been provided.
If no docstring is given, only returns the method name.
The default implementation of this method returns the first line of
the specified test method's docstring.
"""
desc = str(self)
doc_first_line = None
doc = self._testMethodDoc
return doc and doc.split("\n")[0].strip() or None
if self._testMethodDoc:
doc_first_line = self._testMethodDoc.split("\n")[0].strip()
if doc_first_line:
desc = '\n'.join((desc, doc_first_line))
return desc
def id(self):
return "%s.%s" % (util.strclass(self.__class__), self._testMethodName)
@ -501,7 +498,6 @@ class TestCase(object):
assertNotEquals = assertNotEqual
assertAlmostEquals = assertAlmostEqual
assertNotAlmostEquals = assertNotAlmostEqual
assert_ = assertTrue
# These fail* assertion method names are pending deprecation and will
# be a DeprecationWarning in 3.2; http://bugs.python.org/issue2578
@ -518,6 +514,7 @@ class TestCase(object):
failUnlessAlmostEqual = _deprecate(assertAlmostEqual)
failIfAlmostEqual = _deprecate(assertNotAlmostEqual)
failUnless = _deprecate(assertTrue)
assert_ = _deprecate(assertTrue)
failUnlessRaises = _deprecate(assertRaises)
failIf = _deprecate(assertFalse)

View file

@ -27,7 +27,7 @@ class TestResult(object):
def startTest(self, test):
"Called when the given test is about to be run"
self.testsRun = self.testsRun + 1
self.testsRun += 1
def startTestRun(self):
"""Called once before any tests are executed.
@ -36,8 +36,7 @@ class TestResult(object):
"""
def stopTest(self, test):
"Called when the given test has been run"
pass
"""Called when the given test has been run"""
def stopTestRun(self):
"""Called once after all tests are executed.

View file

@ -22,7 +22,7 @@ class _WritelnDecorator(object):
self.write('\n') # text-mode streams translate to \r\n if needed
class _TextTestResult(result.TestResult):
class TextTestResult(result.TestResult):
"""A test result class that can print formatted text results to a stream.
Used by TextTestRunner.
@ -31,27 +31,28 @@ class _TextTestResult(result.TestResult):
separator2 = '-' * 70
def __init__(self, stream, descriptions, verbosity):
super(_TextTestResult, self).__init__()
super(TextTestResult, self).__init__()
self.stream = stream
self.showAll = verbosity > 1
self.dots = verbosity == 1
self.descriptions = descriptions
def getDescription(self, test):
if self.descriptions:
return test.shortDescription() or str(test)
doc_first_line = test.shortDescription()
if self.descriptions and doc_first_line:
return '\n'.join((str(test), doc_first_line))
else:
return str(test)
def startTest(self, test):
super(_TextTestResult, self).startTest(test)
super(TextTestResult, self).startTest(test)
if self.showAll:
self.stream.write(self.getDescription(test))
self.stream.write(" ... ")
self.stream.flush()
def addSuccess(self, test):
super(_TextTestResult, self).addSuccess(test)
super(TextTestResult, self).addSuccess(test)
if self.showAll:
self.stream.writeln("ok")
elif self.dots:
@ -59,7 +60,7 @@ class _TextTestResult(result.TestResult):
self.stream.flush()
def addError(self, test, err):
super(_TextTestResult, self).addError(test, err)
super(TextTestResult, self).addError(test, err)
if self.showAll:
self.stream.writeln("ERROR")
elif self.dots:
@ -67,7 +68,7 @@ class _TextTestResult(result.TestResult):
self.stream.flush()
def addFailure(self, test, err):
super(_TextTestResult, self).addFailure(test, err)
super(TextTestResult, self).addFailure(test, err)
if self.showAll:
self.stream.writeln("FAIL")
elif self.dots:
@ -75,7 +76,7 @@ class _TextTestResult(result.TestResult):
self.stream.flush()
def addSkip(self, test, reason):
super(_TextTestResult, self).addSkip(test, reason)
super(TextTestResult, self).addSkip(test, reason)
if self.showAll:
self.stream.writeln("skipped {0!r}".format(reason))
elif self.dots:
@ -83,7 +84,7 @@ class _TextTestResult(result.TestResult):
self.stream.flush()
def addExpectedFailure(self, test, err):
super(_TextTestResult, self).addExpectedFailure(test, err)
super(TextTestResult, self).addExpectedFailure(test, err)
if self.showAll:
self.stream.writeln("expected failure")
elif self.dots:
@ -91,7 +92,7 @@ class _TextTestResult(result.TestResult):
self.stream.flush()
def addUnexpectedSuccess(self, test):
super(_TextTestResult, self).addUnexpectedSuccess(test)
super(TextTestResult, self).addUnexpectedSuccess(test)
if self.showAll:
self.stream.writeln("unexpected success")
elif self.dots:
@ -118,13 +119,18 @@ class TextTestRunner(object):
It prints out the names of tests as they are run, errors as they
occur, and a summary of the results at the end of the test run.
"""
def __init__(self, stream=sys.stderr, descriptions=1, verbosity=1):
resultclass = TextTestResult
def __init__(self, stream=sys.stderr, descriptions=True, verbosity=1,
resultclass=None):
self.stream = _WritelnDecorator(stream)
self.descriptions = descriptions
self.verbosity = verbosity
if resultclass is not None:
self.resultclass = resultclass
def _makeResult(self):
return _TextTestResult(self.stream, self.descriptions, self.verbosity)
return self.resultclass(self.stream, self.descriptions, self.verbosity)
def run(self, test):
"Run the given test case or test suite."