diff -r acdebfbfbdcf Doc/library/unittest.rst --- a/Doc/library/unittest.rst Tue Oct 06 13:29:56 2015 -0400 +++ b/Doc/library/unittest.rst Wed Oct 07 15:07:34 2015 +0000 @@ -218,6 +218,10 @@ Show local variables in tracebacks. +.. cmdoption:: -g, --garbage-collected + + Run garbage collection after each test. + .. versionadded:: 3.2 The command-line options ``-b``, ``-c`` and ``-f`` were added. diff -r acdebfbfbdcf Lib/unittest/main.py --- a/Lib/unittest/main.py Tue Oct 06 13:29:56 2015 -0400 +++ b/Lib/unittest/main.py Wed Oct 07 15:07:34 2015 +0000 @@ -52,13 +52,15 @@ # defaults for testing module=None verbosity = 1 + gc_enabled = False failfast = catchbreak = buffer = progName = warnings = None _discovery_parser = None def __init__(self, module='__main__', defaultTest=None, argv=None, testRunner=None, testLoader=loader.defaultTestLoader, exit=True, verbosity=1, failfast=None, catchbreak=None, - buffer=None, warnings=None, *, tb_locals=False): + buffer=None, warnings=None, *, tb_locals=False, + gc_enabled=False): if isinstance(module, str): self.module = __import__(module) for part in module.split('.')[1:]: @@ -74,6 +76,7 @@ self.verbosity = verbosity self.buffer = buffer self.tb_locals = tb_locals + self.gc_enabled = gc_enabled if warnings is None and not sys.warnoptions: # even if DeprecationWarnings are ignored by default # print them anyway unless other warnings settings are @@ -163,6 +166,9 @@ parser.add_argument('--locals', dest='tb_locals', action='store_true', help='Show local variables in tracebacks') + parser.add_argument('-g', '--garbage-collected', dest='gc_enabled', + action='store_true', + help='Run garbage collection after each test') if self.failfast is None: parser.add_argument('-f', '--failfast', dest='failfast', action='store_true', @@ -239,13 +245,15 @@ failfast=self.failfast, buffer=self.buffer, warnings=self.warnings, - tb_locals=self.tb_locals) + tb_locals=self.tb_locals, + gc_enabled=self.gc_enabled) except TypeError: # didn't accept the tb_locals argument testRunner = self.testRunner(verbosity=self.verbosity, failfast=self.failfast, buffer=self.buffer, - warnings=self.warnings) + warnings=self.warnings, + gc_enabled=self.gc_enabled) except TypeError: # didn't accept the verbosity, buffer or failfast arguments testRunner = self.testRunner() diff -r acdebfbfbdcf Lib/unittest/result.py --- a/Lib/unittest/result.py Tue Oct 06 13:29:56 2015 -0400 +++ b/Lib/unittest/result.py Wed Oct 07 15:07:34 2015 +0000 @@ -1,5 +1,6 @@ """Test result object""" +import gc import io import sys import traceback @@ -35,10 +36,12 @@ _previousTestClass = None _testRunEntered = False _moduleSetUpFailed = False - def __init__(self, stream=None, descriptions=None, verbosity=None): + def __init__(self, stream=None, descriptions=None, + verbosity=None, gc_enabled=False): self.failfast = False self.failures = [] self.errors = [] + self.gc_enabled=gc_enabled self.testsRun = 0 self.skipped = [] self.expectedFailures = [] @@ -79,6 +82,8 @@ """Called when the given test has been run""" self._restoreStdout() self._mirrorOutput = False + if self.gc_enabled: + gc.collect() def _restoreStdout(self): if self.buffer: diff -r acdebfbfbdcf Lib/unittest/runner.py --- a/Lib/unittest/runner.py Tue Oct 06 13:29:56 2015 -0400 +++ b/Lib/unittest/runner.py Wed Oct 07 15:07:34 2015 +0000 @@ -34,8 +34,9 @@ separator1 = '=' * 70 separator2 = '-' * 70 - def __init__(self, stream, descriptions, verbosity): - super(TextTestResult, self).__init__(stream, descriptions, verbosity) + def __init__(self, stream, descriptions, verbosity, gc_enabled): + super(TextTestResult, self).__init__(stream, descriptions, + verbosity, gc_enabled) self.stream = stream self.showAll = verbosity > 1 self.dots = verbosity == 1 @@ -127,7 +128,7 @@ def __init__(self, stream=None, descriptions=True, verbosity=1, failfast=False, buffer=False, resultclass=None, warnings=None, - *, tb_locals=False): + *, tb_locals=False, gc_enabled=False): """Construct a TextTestRunner. Subclasses should accept **kwargs to ensure compatibility as the @@ -139,6 +140,7 @@ self.descriptions = descriptions self.verbosity = verbosity self.failfast = failfast + self.gc_enabled = gc_enabled self.buffer = buffer self.tb_locals = tb_locals self.warnings = warnings @@ -146,7 +148,8 @@ self.resultclass = resultclass def _makeResult(self): - return self.resultclass(self.stream, self.descriptions, self.verbosity) + return self.resultclass(self.stream, self.descriptions, + self.verbosity, self.gc_enabled) def run(self, test): "Run the given test case or test suite."