New submission from Robert Collins: TestProgram uses defaultTestLoader to load tests. Calling discover() on a TestLoader sets _top_level_dir. Calling discover with no top_level_dir implictly sets _top_level_dir but only the first time: the second time it is called with a different start_dir the prior one is used.
This leads to errors like: ====================================================================== ERROR: test_run_list_failed_import (testtools.tests.test_run.TestRun) testtools.tests.test_run.TestRun.test_run_list_failed_import ---------------------------------------------------------------------- _StringException: Traceback (most recent call last): File "/home/robertc/personal/testtools/testtools/tests/test_run.py", line 175, in test_run_list_failed_import run.main, ['prog', 'discover', '-l', broken.package.base, '*.py'], out) File "/home/robertc/personal/testtools/testtools/testcase.py", line 420, in assertRaises self.assertThat(our_callable, matcher) File "/home/robertc/personal/testtools/testtools/testcase.py", line 431, in assertThat mismatch_error = self._matchHelper(matchee, matcher, message, verbose) File "/home/robertc/personal/testtools/testtools/testcase.py", line 481, in _matchHelper mismatch = matcher.match(matchee) File "/home/robertc/personal/testtools/testtools/matchers/_exception.py", line 108, in match mismatch = self.exception_matcher.match(exc_info) File "/home/robertc/personal/testtools/testtools/matchers/_higherorder.py", line 62, in match mismatch = matcher.match(matchee) File "/home/robertc/personal/testtools/testtools/testcase.py", line 412, in match reraise(*matchee) File "/home/robertc/personal/testtools/testtools/matchers/_exception.py", line 101, in match result = matchee() File "/home/robertc/personal/testtools/testtools/testcase.py", line 965, in __call__ return self._callable_object(*self._args, **self._kwargs) File "/home/robertc/personal/testtools/testtools/run.py", line 413, in main stdout=stdout) File "/home/robertc/personal/testtools/testtools/run.py", line 208, in __init__ self.parseArgs(argv) File "/home/robertc/personal/testtools/testtools/run.py", line 252, in parseArgs self._do_discovery(argv[2:]) File "/home/robertc/personal/testtools/testtools/run.py", line 368, in _do_discovery loaded = loader.discover(self.start, self.pattern, self.top) File "/home/robertc/.virtualenvs/testtools-2.7/local/lib/python2.7/site-packages/unittest2/loader.py", line 353, in discover raise ImportError('Start directory is not importable: %r' % start_dir) ImportError: Start directory is not importable: '/tmp/tmpac4uwI' When a test tries to test the behaviour of TestProgram (or a subclass thereof). The fix is straight forward: at the end of discover restore the value of _top_level_dir that it had at entry. ---------- messages: 230770 nosy: rbcollins priority: normal severity: normal status: open title: _top_level_dir state leaks on defaultTestLoader _______________________________________ Python tracker <rep...@bugs.python.org> <http://bugs.python.org/issue22811> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com