[Python-Dev] regression tests with regrtest.py -r
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