--- unittest.py.orig 2004-09-24 10:33:21.933370804 +0200 +++ unittest.py 2004-09-24 02:21:25.000000000 +0200 @@ -75,6 +75,8 @@ def _strclass(cls): return "%s.%s" % (cls.__module__, cls.__name__) +class SkipException(Exception): pass + class TestResult: """Holder for test result information. @@ -89,6 +91,7 @@ def __init__(self): self.failures = [] self.errors = [] + self.skipped = [] self.testsRun = 0 self.shouldStop = 0 @@ -111,6 +114,11 @@ returned by sys.exc_info().""" self.failures.append((test, self._exc_info_to_string(err))) + def addSkipped(self, test, err): + """Called when a test is skipped. 'err' is a tuble of values as + returned by sys.exc_info().""" + self.skipped.append((test, str(err[1]))) + def addSuccess(self, test): "Called when a test has completed successfully" pass @@ -128,9 +136,9 @@ return string.join(traceback.format_exception(*err), '') def __repr__(self): - return "<%s run=%i errors=%i failures=%i>" % \ + return "<%s run=%i errors=%i failures=%i skipped=%i>" % \ (_strclass(self.__class__), self.testsRun, len(self.errors), - len(self.failures)) + len(self.failures), len(self.skipped)) class TestCase: @@ -218,6 +226,9 @@ try: try: self.setUp() + except SkipException: + result.addSkipped(self, self.__exc_info()) + return except KeyboardInterrupt: raise except: @@ -230,6 +241,8 @@ ok = 1 except self.failureException: result.addFailure(self, self.__exc_info()) + except SkipException: + result.addSkipped(self, self.__exc_info()) except KeyboardInterrupt: raise except: @@ -346,6 +359,13 @@ assert_ = failUnless + 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 class TestSuite: @@ -623,6 +643,16 @@ elif self.dots: self.stream.write('F') + def addSkipped(self, test, err): + 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') + def printErrors(self): if self.dots or self.showAll: self.stream.writeln() @@ -666,15 +696,20 @@ self.stream.writeln() if not result.wasSuccessful(): self.stream.write("FAILED (") - failed, errored = map(len, (result.failures, result.errors)) + 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: - self.stream.writeln("OK") + if result.skipped: + self.stream.writeln("OK (skipped=%d)" % len(result.skipped)) + else: + self.stream.writeln("OK") return result