diff --git a/Doc/lib/libunittest.tex b/Doc/lib/libunittest.tex index 350abae7863..782c6edc925 100644 --- a/Doc/lib/libunittest.tex +++ b/Doc/lib/libunittest.tex @@ -290,6 +290,7 @@ Often, many small test cases will use the same fixture. In this case, we would end up subclassing \class{SimpleWidgetTestCase} into many small one-method classes such as \class{DefaultWidgetSizeTestCase}. This is time-consuming and + discouraging, so in the same vein as JUnit, \module{unittest} provides a simpler mechanism: @@ -540,7 +541,7 @@ easier.} \begin{funcdesc}{main}{\optional{module\optional{, defaultTest\optional{, argv\optional{, - testRunner\optional{, testRunner}}}}}} + testRunner\optional{, testLoader}}}}}} A command-line program that runs a set of tests; this is primarily for making test modules conveniently executable. The simplest use for this function is to include the following line at the end of a @@ -550,6 +551,9 @@ easier.} if __name__ == '__main__': unittest.main() \end{verbatim} + + The \var{testRunner} argument can either be a test runner class or + an already created instance of it. \end{funcdesc} In some cases, the existing tests may have been written using the diff --git a/Lib/unittest.py b/Lib/unittest.py index abd92238362..0d69f526870 100644 --- a/Lib/unittest.py +++ b/Lib/unittest.py @@ -776,7 +776,8 @@ Examples: in MyTestCase """ def __init__(self, module='__main__', defaultTest=None, - argv=None, testRunner=None, testLoader=defaultTestLoader): + argv=None, testRunner=TextTestRunner, + testLoader=defaultTestLoader): if type(module) == type(''): self.module = __import__(module) for part in module.split('.')[1:]: @@ -826,9 +827,16 @@ Examples: self.module) def runTests(self): - if self.testRunner is None: - self.testRunner = TextTestRunner(verbosity=self.verbosity) - result = self.testRunner.run(self.test) + if isinstance(self.testRunner, (type, types.ClassType)): + try: + testRunner = self.testRunner(verbosity=self.verbosity) + except TypeError: + # didn't accept the verbosity argument + testRunner = self.testRunner() + else: + # it is assumed to be a TestRunner instance + testRunner = self.testRunner + result = testRunner.run(self.test) sys.exit(not result.wasSuccessful()) main = TestProgram diff --git a/Misc/NEWS b/Misc/NEWS index 34ed2c76464..0452f83eba7 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -152,6 +152,9 @@ Core and builtins Library ------- +- Patch #787789: allow to pass custom TestRunner instances to unittest's + main() function. + - Patches #1550273, #1550272: fix a few bugs in unittest and add a comprehensive test suite for the module.