You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
152 lines
4.2 KiB
152 lines
4.2 KiB
"""Monkey patch lame-o vanilla unittest with test skip feature.
|
|
|
|
From the patch that was never applied (shameful!):
|
|
http://bugs.python.org/issue1034053
|
|
"""
|
|
|
|
import time, unittest
|
|
|
|
|
|
class SkipException(Exception):
|
|
pass
|
|
|
|
|
|
def TestResult__init__(self):
|
|
self.failures = []
|
|
self.errors = []
|
|
self.skipped = []
|
|
self.testsRun = 0
|
|
self.shouldStop = 0
|
|
|
|
unittest.TestResult.__init__ = TestResult__init__
|
|
|
|
|
|
def TestResult_addSkipped(self, test, err):
|
|
"""Called when a test is skipped.
|
|
|
|
'err' is a tuple of values as returned by sys.exc_info().
|
|
"""
|
|
self.skipped.append((test, str(err[1])))
|
|
|
|
unittest.TestResult.addSkipped = TestResult_addSkipped
|
|
|
|
|
|
def TestResult__repr__(self):
|
|
return "<%s run=%i errors=%i failures=%i skipped=%i>" % (
|
|
unittest._strclass(self.__class__), self.testsRun,
|
|
len(self.errors), len(self.failures), len(self.skipped))
|
|
|
|
unittest.TestResult.__repr__ = TestResult__repr__
|
|
|
|
|
|
class TestCase(unittest.TestCase):
|
|
# Yuck, all of run has to be copied for this.
|
|
# I don't care about wrapping setUp atm.
|
|
def run(self, result=None):
|
|
if result is None: result = self.defaultTestResult()
|
|
result.startTest(self)
|
|
# Support variable naming differences between 2.4 and 2.6
|
|
# Yay for silly variable hiding
|
|
try:
|
|
testMethodName = self.__testMethodName
|
|
exc_info = self.__exc_info
|
|
except AttributeError:
|
|
testMethodName = self._testMethodName
|
|
exc_info = self._exc_info
|
|
|
|
testMethod = getattr(self, testMethodName)
|
|
|
|
try:
|
|
try:
|
|
self.setUp()
|
|
except KeyboardInterrupt:
|
|
raise
|
|
except:
|
|
result.addError(self, exc_info())
|
|
return
|
|
|
|
ok = False
|
|
try:
|
|
testMethod()
|
|
ok = True
|
|
except self.failureException:
|
|
result.addFailure(self, exc_info())
|
|
except SkipException:
|
|
result.addSkipped(self, exc_info())
|
|
except KeyboardInterrupt:
|
|
raise
|
|
except:
|
|
result.addError(self, exc_info())
|
|
|
|
try:
|
|
self.tearDown()
|
|
except KeyboardInterrupt:
|
|
raise
|
|
except:
|
|
result.addError(self, exc_info())
|
|
ok = False
|
|
if ok: result.addSuccess(self)
|
|
finally:
|
|
result.stopTest(self)
|
|
|
|
|
|
def skip(self, msg=None):
|
|
"""Skip the test, with the given message."""
|
|
raise SkipException(msg)
|
|
|
|
|
|
def skipIf(self, expr, msg=None):
|
|
"""Skip the test if the expression is true."""
|
|
if expr:
|
|
raise SkipException(msg)
|
|
|
|
|
|
def _TextTestResult_addSkipped(self, test, err):
|
|
unittest.TestResult.addSkipped(self, test, err)
|
|
if self.showAll:
|
|
msg = str(err[1])
|
|
if msg:
|
|
msg = " (" + msg + ")"
|
|
self.stream.writeln("SKIPPED" + msg)
|
|
elif self.dots:
|
|
self.stream.write('S')
|
|
|
|
unittest._TextTestResult.addSkipped = _TextTestResult_addSkipped
|
|
|
|
|
|
# Bah
|
|
def TextTestRunner_run(self, test):
|
|
"Run the given test case or test suite."
|
|
result = self._makeResult()
|
|
startTime = time.time()
|
|
test(result)
|
|
stopTime = time.time()
|
|
timeTaken = stopTime - startTime
|
|
result.printErrors()
|
|
self.stream.writeln(result.separator2)
|
|
run = result.testsRun
|
|
self.stream.writeln("Ran %d test%s in %.3fs" %
|
|
(run, run != 1 and "s" or "", timeTaken))
|
|
self.stream.writeln()
|
|
if not result.wasSuccessful():
|
|
self.stream.write("FAILED (")
|
|
failed, errored, skipped = map(
|
|
len, (result.failures, result.errors, result.skipped))
|
|
if failed:
|
|
self.stream.write("failures=%d" % failed)
|
|
if errored:
|
|
if failed: self.stream.write(", ")
|
|
self.stream.write("errors=%d" % errored)
|
|
if skipped:
|
|
self.stream.write(", skipped=%d" % skipped)
|
|
self.stream.writeln(")")
|
|
else:
|
|
if result.skipped:
|
|
self.stream.writeln(
|
|
"OK (skipped=%d)" % len(result.skipped))
|
|
else:
|
|
self.stream.writeln("OK")
|
|
return result
|
|
|
|
unittest.TextTestRunner.run = TextTestRunner_run
|