On Mon, 31 Dec 2012 00:38:47 +1000, Nick Coghlan
On Mon, Dec 31, 2012 at 12:19 AM, Eli Bendersky
wrote: On Sun, Dec 30, 2012 at 5:54 AM, Stefan Krah
wrote: Eli Bendersky
wrote: Yes, this is the solution currently used in test_xml_etree. However, once pickling tests are added things stop working. Pickle uses __import__ to import the module a class belongs to, bypassing all such trickery. So if test___all__ got _elementtree into sys.modules, pickle's __import__ finds it even if all the tests in test_xml_etree manage to ignore it for the Python version because they use import_fresh_module.
I ran into the same problem for test_decimal. The only thing that appears to work is to set sys.modules['decimal'] explicitly before calling dumps()/loads(). See:
PythonAPItests.test_pickle() ContextAPItests.test_pickle()
Yes, this seems to have done the trick. Thanks for the suggestion.
It may be worth offering a context manager/decorator equivalent to "import_fresh_module".
I suggested making import_fresh_module a context manager in the issue that Eli opened about test___all__.
I'm still curious about the test-in-clean-env question though.
As Stefan noted, the main advantage we get is that sometimes the failure to clean up properly is in the standard lib code rather than the tests, and with complete isolation we'd be less likely to notice the problem.
Once you combine that with the fact that rearchitecting regrtest to work that way would be quite a bit of work, the motivation to make it happen goes way down.
However, specifically spinning out the "import the world" tests like test_pydoc and test___all__ to a separate process might be worth the effort.
Adding something to regertest (or unittest?) so that certain nominated test modules are run in a subprocess has been discussed previously, but so far no one has stepped up to implement it :) (I think this came up originally for test_site, but I don't remember for sure.) --David