1*9c5db199SXin Li# Lint as: python2, python3 2*9c5db199SXin Li"""Monkey patch lame-o vanilla unittest with test skip feature. 3*9c5db199SXin Li 4*9c5db199SXin LiFrom the patch that was never applied (shameful!): 5*9c5db199SXin Lihttp://bugs.python.org/issue1034053 6*9c5db199SXin Li""" 7*9c5db199SXin Li 8*9c5db199SXin Lifrom __future__ import absolute_import 9*9c5db199SXin Lifrom __future__ import division 10*9c5db199SXin Lifrom __future__ import print_function 11*9c5db199SXin Liimport time, unittest 12*9c5db199SXin Lifrom six.moves import map 13*9c5db199SXin Li 14*9c5db199SXin Li 15*9c5db199SXin Liclass SkipException(Exception): 16*9c5db199SXin Li pass 17*9c5db199SXin Li 18*9c5db199SXin Li 19*9c5db199SXin Lidef TestResult__init__(self): 20*9c5db199SXin Li self.failures = [] 21*9c5db199SXin Li self.errors = [] 22*9c5db199SXin Li self.skipped = [] 23*9c5db199SXin Li self.testsRun = 0 24*9c5db199SXin Li self.shouldStop = 0 25*9c5db199SXin Li 26*9c5db199SXin Liunittest.TestResult.__init__ = TestResult__init__ 27*9c5db199SXin Li 28*9c5db199SXin Li 29*9c5db199SXin Lidef TestResult_addSkipped(self, test, err): 30*9c5db199SXin Li """Called when a test is skipped. 31*9c5db199SXin Li 32*9c5db199SXin Li 'err' is a tuple of values as returned by sys.exc_info(). 33*9c5db199SXin Li """ 34*9c5db199SXin Li self.skipped.append((test, str(err[1]))) 35*9c5db199SXin Li 36*9c5db199SXin Liunittest.TestResult.addSkipped = TestResult_addSkipped 37*9c5db199SXin Li 38*9c5db199SXin Li 39*9c5db199SXin Lidef TestResult__repr__(self): 40*9c5db199SXin Li return "<%s run=%i errors=%i failures=%i skipped=%i>" % ( 41*9c5db199SXin Li unittest._strclass(self.__class__), self.testsRun, 42*9c5db199SXin Li len(self.errors), len(self.failures), len(self.skipped)) 43*9c5db199SXin Li 44*9c5db199SXin Liunittest.TestResult.__repr__ = TestResult__repr__ 45*9c5db199SXin Li 46*9c5db199SXin Li 47*9c5db199SXin Liclass TestCase(unittest.TestCase): 48*9c5db199SXin Li # Yuck, all of run has to be copied for this. 49*9c5db199SXin Li # I don't care about wrapping setUp atm. 50*9c5db199SXin Li def run(self, result=None): 51*9c5db199SXin Li if result is None: result = self.defaultTestResult() 52*9c5db199SXin Li result.startTest(self) 53*9c5db199SXin Li # Support variable naming differences between 2.4 and 2.6 54*9c5db199SXin Li # Yay for silly variable hiding 55*9c5db199SXin Li try: 56*9c5db199SXin Li testMethodName = self.__testMethodName 57*9c5db199SXin Li exc_info = self.__exc_info 58*9c5db199SXin Li except AttributeError: 59*9c5db199SXin Li testMethodName = self._testMethodName 60*9c5db199SXin Li exc_info = self._exc_info 61*9c5db199SXin Li 62*9c5db199SXin Li testMethod = getattr(self, testMethodName) 63*9c5db199SXin Li 64*9c5db199SXin Li try: 65*9c5db199SXin Li try: 66*9c5db199SXin Li self.setUp() 67*9c5db199SXin Li except KeyboardInterrupt: 68*9c5db199SXin Li raise 69*9c5db199SXin Li except: 70*9c5db199SXin Li result.addError(self, exc_info()) 71*9c5db199SXin Li return 72*9c5db199SXin Li 73*9c5db199SXin Li ok = False 74*9c5db199SXin Li try: 75*9c5db199SXin Li testMethod() 76*9c5db199SXin Li ok = True 77*9c5db199SXin Li except self.failureException: 78*9c5db199SXin Li result.addFailure(self, exc_info()) 79*9c5db199SXin Li except SkipException: 80*9c5db199SXin Li result.addSkipped(self, exc_info()) 81*9c5db199SXin Li except KeyboardInterrupt: 82*9c5db199SXin Li raise 83*9c5db199SXin Li except: 84*9c5db199SXin Li result.addError(self, exc_info()) 85*9c5db199SXin Li 86*9c5db199SXin Li try: 87*9c5db199SXin Li self.tearDown() 88*9c5db199SXin Li except KeyboardInterrupt: 89*9c5db199SXin Li raise 90*9c5db199SXin Li except: 91*9c5db199SXin Li result.addError(self, exc_info()) 92*9c5db199SXin Li ok = False 93*9c5db199SXin Li if ok: result.addSuccess(self) 94*9c5db199SXin Li finally: 95*9c5db199SXin Li result.stopTest(self) 96*9c5db199SXin Li 97*9c5db199SXin Li 98*9c5db199SXin Li def skip(self, msg=None): 99*9c5db199SXin Li """Skip the test, with the given message.""" 100*9c5db199SXin Li raise SkipException(msg) 101*9c5db199SXin Li 102*9c5db199SXin Li 103*9c5db199SXin Li def skipIf(self, expr, msg=None): 104*9c5db199SXin Li """Skip the test if the expression is true.""" 105*9c5db199SXin Li if expr: 106*9c5db199SXin Li raise SkipException(msg) 107*9c5db199SXin Li 108*9c5db199SXin Li 109*9c5db199SXin Lidef _TextTestResult_addSkipped(self, test, err): 110*9c5db199SXin Li unittest.TestResult.addSkipped(self, test, err) 111*9c5db199SXin Li if self.showAll: 112*9c5db199SXin Li msg = str(err[1]) 113*9c5db199SXin Li if msg: 114*9c5db199SXin Li msg = " (" + msg + ")" 115*9c5db199SXin Li self.stream.writeln("SKIPPED" + msg) 116*9c5db199SXin Li elif self.dots: 117*9c5db199SXin Li self.stream.write('S') 118*9c5db199SXin Li 119*9c5db199SXin Liunittest._TextTestResult.addSkipped = _TextTestResult_addSkipped 120*9c5db199SXin Li 121*9c5db199SXin Li 122*9c5db199SXin Li# Bah 123*9c5db199SXin Lidef TextTestRunner_run(self, test): 124*9c5db199SXin Li "Run the given test case or test suite." 125*9c5db199SXin Li result = self._makeResult() 126*9c5db199SXin Li startTime = time.time() 127*9c5db199SXin Li test(result) 128*9c5db199SXin Li stopTime = time.time() 129*9c5db199SXin Li timeTaken = stopTime - startTime 130*9c5db199SXin Li result.printErrors() 131*9c5db199SXin Li self.stream.writeln(result.separator2) 132*9c5db199SXin Li run = result.testsRun 133*9c5db199SXin Li self.stream.writeln("Ran %d test%s in %.3fs" % 134*9c5db199SXin Li (run, run != 1 and "s" or "", timeTaken)) 135*9c5db199SXin Li self.stream.writeln() 136*9c5db199SXin Li if not result.wasSuccessful(): 137*9c5db199SXin Li self.stream.write("FAILED (") 138*9c5db199SXin Li failed, errored, skipped = list(map( 139*9c5db199SXin Li len, (result.failures, result.errors, result.skipped))) 140*9c5db199SXin Li if failed: 141*9c5db199SXin Li self.stream.write("failures=%d" % failed) 142*9c5db199SXin Li if errored: 143*9c5db199SXin Li if failed: self.stream.write(", ") 144*9c5db199SXin Li self.stream.write("errors=%d" % errored) 145*9c5db199SXin Li if skipped: 146*9c5db199SXin Li self.stream.write(", skipped=%d" % skipped) 147*9c5db199SXin Li self.stream.writeln(")") 148*9c5db199SXin Li else: 149*9c5db199SXin Li if result.skipped: 150*9c5db199SXin Li self.stream.writeln( 151*9c5db199SXin Li "OK (skipped=%d)" % len(result.skipped)) 152*9c5db199SXin Li else: 153*9c5db199SXin Li self.stream.writeln("OK") 154*9c5db199SXin Li return result 155*9c5db199SXin Li 156*9c5db199SXin Liunittest.TextTestRunner.run = TextTestRunner_run 157