[Python-Dev] regression tests with regrtest.py -r (original) (raw)

Tim Peters tim.one@home.com
Sat, 15 Dec 2001 15:29:15 -0500


Here's one cause of current -r failures on Windows:

C:\Code\python\PCbuild>python ../lib/test/regrtest.py
test_pty test___all__ test_pty test test_pty skipped -- No module named termios test___all__ test test___all__ failed -- pty has no all attribute 1 test failed: test___all__ 1 test skipped: test_pty Those skips are all expected on win32.

It's "the usual": importing pty fails on Windows, but test_pty then leaves behind a bogus pty module object in sys.modules, which fools test___all__. Note that pty.py already has this atrocity from a previous round of -r wrestling:

"""

Absurd: import termios and then delete it. This is to force an attempt

to import pty to raise an ImportError on platforms that lack termios.

Without this explicit import of termios here, some other module may

import tty first, which in turn imports termios and dies with an

ImportError then. But since tty does exist across platforms, that

leaves a damaged module object for tty in sys.modules, and the import

of tty here then appears to work despite that the tty imported is junk.

import termios del termios

import tty """

test___all__ also tries to compensate for pty (among others) insanity:

""" def check_all(modname): names = {} try: exec "import %s" % modname in names except ImportError: # Silent fail here seems the best route since some modules # may not be available in all environments. # Since an ImportError may leave a partial module object in # sys.modules, get rid of that first. Here's what happens if # you don't: importing pty fails on Windows because pty tries to # import FCNTL, which doesn't exist. That raises an ImportError, # caught here. It also leaves a partial pty module in sys.modules. # So when test_pty is called later, the import of pty succeeds, # but shouldn't. As a result, test_pty crashes with an # AttributeError instead of an ImportError, and regrtest interprets # the latter as a test failure (ImportError is treated as "test # skipped" -- which is what test_pty should say on Windows). try: del sys.modules[modname] except KeyError: pass return """

I've added another hack to regrtest.py to worm around the test_pty followed by test___all__ case (more generally, any test_xxx followed by test___all__ case, when test_xxx fails due to leaving behind a damaged module object for xxx). However, that still doesn't fix

test_rlcompleter

followed by

test___all__

on Windows. In that case, test_rlcompleter leaves behind a damaged rlcompleter module, because rlcompleter.py does exist on Windows (it fails due to the lack of the readline module).

leaving-behind-incomplete-module-objects-still-seems-like-a-bad-idea- to-me-ly y'rs - tim