##// END OF EJS Templates
Inform user at install time of minimal python requirements if not met....
Inform user at install time of minimal python requirements if not met. Fixes: https://bugs.launchpad.net/ipython/+bug/505090

File last commit:

r2488:ac681df1
r2493:c70f80f1
Show More
iptest.py
434 lines | 16.2 KiB | text/x-python | PythonLexer
Fernando Perez
Add module I forgot
r1574 # -*- coding: utf-8 -*-
"""IPython Test Suite Runner.
Fernando Perez
Cleanup testing machinery.
r1851
Brian Granger
Refactored iptest to include the iptestall capabilities....
r1972 This module provides a main entry point to a user script to test IPython
itself from the command line. There are two ways of running this script:
1. With the syntax `iptest all`. This runs our entire test suite by
calling this script (with different arguments) or trial recursively. This
causes modules and package to be tested in different processes, using nose
or trial where appropriate.
2. With the regular nose syntax, like `iptest -vvs IPython`. In this form
the script simply calls nose, but with special command line flags and
plugins loaded.
For now, this script requires that both nose and twisted are installed. This
will change in the future.
Fernando Perez
Add module I forgot
r1574 """
Fernando Perez
Cleanup testing machinery.
r1851 #-----------------------------------------------------------------------------
# Module imports
#-----------------------------------------------------------------------------
Fernando Perez
Remove accidentally introduced runtime nose dependencies.
r2442 # Stdlib
Brian Granger
Refactored iptest to include the iptestall capabilities....
r1972 import os
import os.path as path
Fernando Perez
Improve test suite robustness by cleaning up stale processes when possible.
r2399 import signal
Fernando Perez
Add module I forgot
r1574 import sys
Brian Granger
Refactored iptest to include the iptestall capabilities....
r1972 import subprocess
Fernando Perez
Make iptest more reliable under Win32....
r2111 import tempfile
Brian Granger
Refactored iptest to include the iptestall capabilities....
r1972 import time
Fernando Perez
Add module I forgot
r1574 import warnings
Fernando Perez
Make it possible to run the tests from the source dir without installation....
r2481
# Ugly, but necessary hack to ensure the test suite finds our version of
# IPython and not a possibly different one that may exist system-wide.
# Note that this must be done here, so the imports that come next work
# correctly even if IPython isn't installed yet.
p = os.path
ippath = p.abspath(p.join(p.dirname(__file__),'..','..'))
sys.path.insert(0, ippath)
Fernando Perez
Remove accidentally introduced runtime nose dependencies.
r2442 # Note: monkeypatch!
# We need to monkeypatch a small problem in nose itself first, before importing
# it for actual use. This should get into nose upstream, but its release cycle
# is slow and we need it for our parametric tests to work correctly.
Fernando Perez
Let iptest pass arguments correctly to nose (in-process or in subprocess)....
r2480 from IPython.testing import nosepatch
Fernando Perez
Remove accidentally introduced runtime nose dependencies.
r2442 # Now, proceed to import nose itself
Fernando Perez
Add module I forgot
r1574 import nose.plugins.builtin
Fernando Perez
Cleanup testing machinery.
r1851 from nose.core import TestProgram
Fernando Perez
Add module I forgot
r1574
Fernando Perez
Remove accidentally introduced runtime nose dependencies.
r2442 # Our own imports
Fernando Perez
Work in multiple places to improve state of the test suite....
r2398 from IPython.utils import genutils
from IPython.utils.platutils import find_cmd, FindCmdError
Fernando Perez
Let iptest pass arguments correctly to nose (in-process or in subprocess)....
r2480 from IPython.testing import globalipapp
from IPython.testing import tools
from IPython.testing.plugin.ipdoctest import IPythonDoctest
Fernando Perez
Add module I forgot
r1574
Brian Granger
Making the doctest exclude paths os independent.
r1979 pjoin = path.join
Fernando Perez
Cleanup testing machinery.
r1851 #-----------------------------------------------------------------------------
Fernando Perez
Work in multiple places to improve state of the test suite....
r2398 # Warnings control
#-----------------------------------------------------------------------------
# Twisted generates annoying warnings with Python 2.6, as will do other code
# that imports 'sets' as of today
warnings.filterwarnings('ignore', 'the sets module is deprecated',
DeprecationWarning )
Fernando Perez
Fixes for test suite in win32 when all dependencies (esp. Twisted) are...
r2461 # This one also comes from Twisted
warnings.filterwarnings('ignore', 'the sha module is deprecated',
DeprecationWarning)
Fernando Perez
Fixes to make test suite more robust on Fedora....
r2483 # Wx on Fedora11 spits these out
warnings.filterwarnings('ignore', 'wxPython/wxWidgets release number mismatch',
UserWarning)
Fernando Perez
Work in multiple places to improve state of the test suite....
r2398 #-----------------------------------------------------------------------------
Administrator
Fixing bugs with the testing system.
r1981 # Logic for skipping doctests
Fernando Perez
Cleanup testing machinery.
r1851 #-----------------------------------------------------------------------------
Administrator
Fixing bugs with the testing system.
r1981 def test_for(mod):
"""Test to see if mod is importable."""
try:
__import__(mod)
Fernando Perez
Make the test suite runnable without X11 connections....
r2488 except (ImportError, RuntimeError):
# GTK reports Runtime error if it can't be initialized even if it's
# importable.
Administrator
Fixing bugs with the testing system.
r1981 return False
else:
return True
Fernando Perez
Fix test failure when pexpect not available
r2455
Administrator
Fixing bugs with the testing system.
r1981 have_curses = test_for('_curses')
have_wx = test_for('wx')
Fernando Perez
Small fixes for wx-dependent tests and include clearcmd....
r2091 have_wx_aui = test_for('wx.aui')
Administrator
Fixing bugs with the testing system.
r1981 have_zi = test_for('zope.interface')
have_twisted = test_for('twisted')
have_foolscap = test_for('foolscap')
have_objc = test_for('objc')
have_pexpect = test_for('pexpect')
Brian Granger
Updated iptest to skip inputhook*.py files for doctesting.
r2083 have_gtk = test_for('gtk')
have_gobject = test_for('gobject')
Administrator
Fixing bugs with the testing system.
r1981
Administrator
Fixing doctest EXCLUDES in iptest on win32....
r1980
Brian Granger
Refactored iptest.py to work with new package org....
r2079 def make_exclude():
Fernando Perez
Fix test suite when Twisted not available, cleanups to iptest for clarity.
r2454 """Make patterns of modules and packages to exclude from testing.
For the IPythonDoctest plugin, we need to exclude certain patterns that
cause testing problems. We should strive to minimize the number of
skipped modules, since this means untested code. As the testing
machinery solidifies, this list should eventually become empty.
These modules and packages will NOT get scanned by nose at all for tests.
"""
# Simple utility to make IPython paths more readably, we need a lot of
# these below
ipjoin = lambda *paths: pjoin('IPython', *paths)
exclusions = [ipjoin('external'),
ipjoin('frontend', 'process', 'winprocess.py'),
Fernando Perez
Make it possible to run the tests from the source dir without installation....
r2481 # Deprecated old Shell and iplib modules, skip to avoid
# warnings
ipjoin('Shell'),
ipjoin('iplib'),
Fernando Perez
Fix config part of the test suite.
r2417 pjoin('IPython_doctest_plugin'),
Fernando Perez
Fix test suite when Twisted not available, cleanups to iptest for clarity.
r2454 ipjoin('quarantine'),
ipjoin('deathrow'),
ipjoin('testing', 'attic'),
Fernando Perez
Fixes for test suite in win32 when all dependencies (esp. Twisted) are...
r2461 # This guy is probably attic material
Fernando Perez
Fix test suite when Twisted not available, cleanups to iptest for clarity.
r2454 ipjoin('testing', 'mkdoctests'),
Fernando Perez
Fixes for test suite in win32 when all dependencies (esp. Twisted) are...
r2461 # Testing inputhook will need a lot of thought, to figure out
# how to have tests that don't lock up with the gui event
# loops in the picture
Fernando Perez
Fix test suite when Twisted not available, cleanups to iptest for clarity.
r2454 ipjoin('lib', 'inputhook'),
Fernando Perez
Fix config part of the test suite.
r2417 # Config files aren't really importable stand-alone
Fernando Perez
Fix test suite when Twisted not available, cleanups to iptest for clarity.
r2454 ipjoin('config', 'default'),
ipjoin('config', 'profile'),
Fernando Perez
Fix config part of the test suite.
r2417 ]
Brian Granger
Refactored iptest.py to work with new package org....
r2079
if not have_wx:
Fernando Perez
Fix test suite when Twisted not available, cleanups to iptest for clarity.
r2454 exclusions.append(ipjoin('gui'))
exclusions.append(ipjoin('frontend', 'wx'))
exclusions.append(ipjoin('lib', 'inputhookwx'))
Brian Granger
Updated iptest to skip inputhook*.py files for doctesting.
r2083
if not have_gtk or not have_gobject:
Fernando Perez
Fix test suite when Twisted not available, cleanups to iptest for clarity.
r2454 exclusions.append(ipjoin('lib', 'inputhookgtk'))
Brian Granger
Refactored iptest.py to work with new package org....
r2079
Brian Granger
Merging -r 1177 from lp:ipython with fixes and resolutions....
r2124 if not have_wx_aui:
Fernando Perez
Fix test suite when Twisted not available, cleanups to iptest for clarity.
r2454 exclusions.append(ipjoin('gui', 'wx', 'wxIPython'))
Brian Granger
Merging -r 1177 from lp:ipython with fixes and resolutions....
r2124
Brian Granger
Refactored iptest.py to work with new package org....
r2079 if not have_objc:
Fernando Perez
Fix test suite when Twisted not available, cleanups to iptest for clarity.
r2454 exclusions.append(ipjoin('frontend', 'cocoa'))
Brian Granger
Refactored iptest.py to work with new package org....
r2079
if not sys.platform == 'win32':
Fernando Perez
Fix test suite when Twisted not available, cleanups to iptest for clarity.
r2454 exclusions.append(ipjoin('utils', 'platutils_win32'))
Brian Granger
Refactored iptest.py to work with new package org....
r2079
# These have to be skipped on win32 because the use echo, rm, cd, etc.
# See ticket https://bugs.launchpad.net/bugs/366982
if sys.platform == 'win32':
Fernando Perez
Fix test suite when Twisted not available, cleanups to iptest for clarity.
r2454 exclusions.append(ipjoin('testing', 'plugin', 'test_exampleip'))
exclusions.append(ipjoin('testing', 'plugin', 'dtexample'))
Brian Granger
Refactored iptest.py to work with new package org....
r2079
if not os.name == 'posix':
Fernando Perez
Fix test suite when Twisted not available, cleanups to iptest for clarity.
r2454 exclusions.append(ipjoin('utils', 'platutils_posix'))
Brian Granger
Refactored iptest.py to work with new package org....
r2079
if not have_pexpect:
Fernando Perez
Fix test failure when pexpect not available
r2455 exclusions.extend([ipjoin('scripts', 'irunner'),
ipjoin('lib', 'irunner')])
Brian Granger
Refactored iptest.py to work with new package org....
r2079
Brian Granger
Merging -r 1196 from lp:ipython....
r2150 # This is scary. We still have things in frontend and testing that
# are being tested by nose that use twisted. We need to rethink
# how we are isolating dependencies in testing.
if not (have_twisted and have_zi and have_foolscap):
Fernando Perez
Fix test suite when Twisted not available, cleanups to iptest for clarity.
r2454 exclusions.extend(
[ipjoin('frontend', 'asyncfrontendbase'),
ipjoin('frontend', 'prefilterfrontend'),
ipjoin('frontend', 'frontendbase'),
ipjoin('frontend', 'linefrontendbase'),
ipjoin('frontend', 'tests', 'test_linefrontend'),
ipjoin('frontend', 'tests', 'test_frontendbase'),
ipjoin('frontend', 'tests', 'test_prefilterfrontend'),
ipjoin('frontend', 'tests', 'test_asyncfrontendbase'),
ipjoin('testing', 'parametric'),
ipjoin('testing', 'util'),
ipjoin('testing', 'tests', 'test_decorators_trial'),
] )
Brian Granger
Merging -r 1196 from lp:ipython....
r2150
Brian Granger
Refactored iptest.py to work with new package org....
r2079 # This is needed for the reg-exp to match on win32 in the ipdoctest plugin.
if sys.platform == 'win32':
Fernando Perez
Massive amount of work to improve the test suite, restores doctests....
r2414 exclusions = [s.replace('\\','\\\\') for s in exclusions]
Brian Granger
Refactored iptest.py to work with new package org....
r2079
Fernando Perez
Massive amount of work to improve the test suite, restores doctests....
r2414 return exclusions
Administrator
Fixing doctest EXCLUDES in iptest on win32....
r1980
Fernando Perez
Cleanup testing machinery.
r1851 #-----------------------------------------------------------------------------
# Functions and classes
#-----------------------------------------------------------------------------
Fernando Perez
Work in multiple places to improve state of the test suite....
r2398 class IPTester(object):
"""Call that calls iptest or trial in a subprocess.
"""
Fernando Perez
Improve test suite robustness by cleaning up stale processes when possible.
r2399 #: string, name of test runner that will be called
runner = None
#: list, parameters for test runner
params = None
#: list, arguments of system call to be made to call test runner
call_args = None
#: list, process ids of subprocesses we start (for cleanup)
pids = None
Fernando Perez
Let iptest pass arguments correctly to nose (in-process or in subprocess)....
r2480 def __init__(self, runner='iptest', params=None):
Fernando Perez
Improve test suite robustness by cleaning up stale processes when possible.
r2399 """Create new test runner."""
Fernando Perez
Work in multiple places to improve state of the test suite....
r2398 if runner == 'iptest':
Fernando Perez
Let iptest pass arguments correctly to nose (in-process or in subprocess)....
r2480 # Find our own 'iptest' script OS-level entry point. Don't look
# system-wide, so we are sure we pick up *this one*. And pass
# through to subprocess call our own sys.argv
Fernando Perez
Make it possible to run the tests from the source dir without installation....
r2481 self.runner = tools.cmd2argv(os.path.abspath(__file__)) + \
sys.argv[1:]
Fernando Perez
Work in multiple places to improve state of the test suite....
r2398 else:
Fernando Perez
Fixes for test suite in win32 when all dependencies (esp. Twisted) are...
r2461 self.runner = tools.cmd2argv(os.path.abspath(find_cmd('trial')))
Fernando Perez
Work in multiple places to improve state of the test suite....
r2398 if params is None:
params = []
Fernando Perez
Let iptest pass arguments correctly to nose (in-process or in subprocess)....
r2480 if isinstance(params, str):
Fernando Perez
Work in multiple places to improve state of the test suite....
r2398 params = [params]
self.params = params
# Assemble call
self.call_args = self.runner+self.params
Fernando Perez
Improve test suite robustness by cleaning up stale processes when possible.
r2399 # Store pids of anything we start to clean up on deletion, if possible
# (on posix only, since win32 has no os.kill)
self.pids = []
Fernando Perez
Work in multiple places to improve state of the test suite....
r2398 if sys.platform == 'win32':
def _run_cmd(self):
# On Windows, use os.system instead of subprocess.call, because I
# was having problems with subprocess and I just don't know enough
# about win32 to debug this reliably. Os.system may be the 'old
# fashioned' way to do it, but it works just fine. If someone
# later can clean this up that's fine, as long as the tests run
# reliably in win32.
return os.system(' '.join(self.call_args))
else:
def _run_cmd(self):
Fernando Perez
Fix tests to return consistent results regardless of how they are called....
r2487 #print >> sys.stderr, '*** CMD:', ' '.join(self.call_args) # dbg
Fernando Perez
Improve test suite robustness by cleaning up stale processes when possible.
r2399 subp = subprocess.Popen(self.call_args)
self.pids.append(subp.pid)
# If this fails, the pid will be left in self.pids and cleaned up
# later, but if the wait call succeeds, then we can clear the
# stored pid.
retcode = subp.wait()
self.pids.pop()
return retcode
Fernando Perez
Work in multiple places to improve state of the test suite....
r2398
def run(self):
"""Run the stored commands"""
try:
return self._run_cmd()
except:
import traceback
traceback.print_exc()
return 1 # signal failure
Fernando Perez
Improve test suite robustness by cleaning up stale processes when possible.
r2399 def __del__(self):
"""Cleanup on exit by killing any leftover processes."""
if not hasattr(os, 'kill'):
return
for pid in self.pids:
try:
print 'Cleaning stale PID:', pid
os.kill(pid, signal.SIGKILL)
except OSError:
# This is just a best effort, if we fail or the process was
# really gone, ignore it.
Fernando Perez
A few small fixes so ipythonx works, and PEP-8 cleanups I found along the way.
r2400 pass
Fernando Perez
Work in multiple places to improve state of the test suite....
r2398
def make_runners():
"""Define the top-level packages that need to be tested.
"""
Fernando Perez
Fixes to make test suite more robust on Fedora....
r2483 # Packages to be tested via nose, that only depend on the stdlib
nose_pkg_names = ['config', 'core', 'extensions', 'frontend', 'lib',
'scripts', 'testing', 'utils' ]
Fernando Perez
Let iptest pass arguments correctly to nose (in-process or in subprocess)....
r2480 # The machinery in kernel needs twisted for real testing
Fernando Perez
Fixes to make test suite more robust on Fedora....
r2483 trial_pkg_names = []
Fernando Perez
Work in multiple places to improve state of the test suite....
r2398
if have_wx:
Fernando Perez
Fixes to make test suite more robust on Fedora....
r2483 nose_pkg_names.append('gui')
Fernando Perez
Work in multiple places to improve state of the test suite....
r2398
# And add twisted ones if conditions are met
if have_zi and have_twisted and have_foolscap:
Fernando Perez
Fixes to make test suite more robust on Fedora....
r2483 # Note that we list the kernel here, though the bulk of it is
# twisted-based, because nose picks up doctests that twisted doesn't.
nose_pkg_names.append('kernel')
trial_pkg_names.append('kernel')
# For debugging this code, only load quick stuff
Fernando Perez
Fix tests to return consistent results regardless of how they are called....
r2487 #nose_pkg_names = ['core'] # dbg
Fernando Perez
Fixes to make test suite more robust on Fedora....
r2483 #trial_pkg_names = [] # dbg
# Make fully qualified package names prepending 'IPython.' to our name lists
nose_packages = ['IPython.%s' % m for m in nose_pkg_names ]
trial_packages = ['IPython.%s' % m for m in trial_pkg_names ]
# Make runners
runners = [ (v, IPTester('iptest', params=v)) for v in nose_packages ]
runners.extend([ (v, IPTester('trial', params=v)) for v in trial_packages ])
Fernando Perez
Work in multiple places to improve state of the test suite....
r2398 return runners
Brian Granger
Refactored iptest to include the iptestall capabilities....
r1972 def run_iptest():
"""Run the IPython test suite using nose.
This function is called when this script is **not** called with the form
`iptest all`. It simply calls nose with appropriate command line flags
and accepts all of the standard nose arguments.
Fernando Perez
Add module I forgot
r1574 """
warnings.filterwarnings('ignore',
'This will be removed soon. Use IPython.testing.util instead')
Fernando Perez
Fix tests to return consistent results regardless of how they are called....
r2487 argv = sys.argv + [ '--detailed-errors', # extra info in tracebacks
# I don't fully understand why we need this one, but
# depending on what directory the test suite is run
# from, if we don't give it, 0 tests get run.
# Specifically, if the test suite is run from the
# source dir with an argument (like 'iptest.py
# IPython.core', 0 tests are run, even if the same call
# done in this directory works fine). It appears that
# if the requested package is in the current dir,
# nose bails early by default. Since it's otherwise
# harmless, leave it in by default.
'--traverse-namespace',
Fernando Perez
Massive amount of work to improve the test suite, restores doctests....
r2414 # Loading ipdoctest causes problems with Twisted, but
# our test suite runner now separates things and runs
# all Twisted tests with trial.
'--with-ipdoctest',
'--ipdoctest-tests','--ipdoctest-extension=txt',
Fernando Perez
Fixes to testing system: ipdocetst plugin wasn't being properly loaded.
r1761 # We add --exe because of setuptools' imbecility (it
# blindly does chmod +x on ALL files). Nose does the
# right thing and it tries to avoid executables,
# setuptools unfortunately forces our hand here. This
# has been discussed on the distutils list and the
# setuptools devs refuse to fix this problem!
'--exe',
]
Fernando Perez
Add module I forgot
r1574
Fernando Perez
Let iptest pass arguments correctly to nose (in-process or in subprocess)....
r2480 # Construct list of plugins, omitting the existing doctest plugin, which
# ours replaces (and extends).
Fernando Perez
Massive amount of work to improve the test suite, restores doctests....
r2414 plugins = [IPythonDoctest(make_exclude())]
Fernando Perez
Fixes to testing system: ipdocetst plugin wasn't being properly loaded.
r1761 for p in nose.plugins.builtin.plugins:
plug = p()
if plug.name == 'doctest':
continue
plugins.append(plug)
Fernando Perez
Massive amount of work to improve the test suite, restores doctests....
r2414 # We need a global ipython running in this process
globalipapp.start_ipython()
# Now nose can run
Fernando Perez
Let iptest pass arguments correctly to nose (in-process or in subprocess)....
r2480 TestProgram(argv=argv, plugins=plugins)
Brian Granger
Refactored iptest to include the iptestall capabilities....
r1972
def run_iptestall():
"""Run the entire IPython test suite by calling nose and trial.
This function constructs :class:`IPTester` instances for all IPython
modules and package and then runs each of them. This causes the modules
and packages of IPython to be tested each in their own subprocess using
nose or twisted.trial appropriately.
"""
Brian Granger
Refactored iptest.py to work with new package org....
r2079
Brian Granger
Refactored iptest to include the iptestall capabilities....
r1972 runners = make_runners()
Brian Granger
Refactored iptest.py to work with new package org....
r2079
Fernando Perez
Work in multiple places to improve state of the test suite....
r2398 # Run the test runners in a temporary dir so we can nuke it when finished
# to clean up any junk files left over by accident. This also makes it
# robust against being run in non-writeable directories by mistake, as the
# temp dir will always be user-writeable.
curdir = os.getcwd()
testdir = tempfile.gettempdir()
os.chdir(testdir)
Brian Granger
Refactored iptest to include the iptestall capabilities....
r1972 # Run all test runners, tracking execution time
Fernando Perez
Let iptest pass arguments correctly to nose (in-process or in subprocess)....
r2480 failed = []
Brian Granger
Refactored iptest to include the iptestall capabilities....
r1972 t_start = time.time()
Fernando Perez
Work in multiple places to improve state of the test suite....
r2398 try:
Fernando Perez
Let iptest pass arguments correctly to nose (in-process or in subprocess)....
r2480 for (name, runner) in runners:
print '*'*70
Fernando Perez
Work in multiple places to improve state of the test suite....
r2398 print 'IPython test group:',name
res = runner.run()
if res:
Fernando Perez
Let iptest pass arguments correctly to nose (in-process or in subprocess)....
r2480 failed.append( (name, runner) )
Fernando Perez
Work in multiple places to improve state of the test suite....
r2398 finally:
os.chdir(curdir)
Brian Granger
Refactored iptest to include the iptestall capabilities....
r1972 t_end = time.time()
t_tests = t_end - t_start
nrunners = len(runners)
nfail = len(failed)
# summarize results
print
Fernando Perez
Let iptest pass arguments correctly to nose (in-process or in subprocess)....
r2480 print '*'*70
Fernando Perez
Small fixes for wx-dependent tests and include clearcmd....
r2091 print 'Ran %s test groups in %.3fs' % (nrunners, t_tests)
Brian Granger
Refactored iptest to include the iptestall capabilities....
r1972 print
if not failed:
print 'OK'
else:
# If anything went wrong, point out what command to rerun manually to
# see the actual errors and individual summary
Fernando Perez
Small fixes for wx-dependent tests and include clearcmd....
r2091 print 'ERROR - %s out of %s test groups failed.' % (nfail, nrunners)
Fernando Perez
Let iptest pass arguments correctly to nose (in-process or in subprocess)....
r2480 for name, failed_runner in failed:
Brian Granger
Refactored iptest to include the iptestall capabilities....
r1972 print '-'*40
print 'Runner failed:',name
print 'You may wish to rerun this one individually, with:'
print ' '.join(failed_runner.call_args)
print
def main():
Fernando Perez
Let iptest pass arguments correctly to nose (in-process or in subprocess)....
r2480 for arg in sys.argv[1:]:
if arg.startswith('IPython'):
Fernando Perez
Make it possible to run the tests from the source dir without installation....
r2481 # This is in-process
Brian Granger
Fixing small bug in iptest. Can now be run as "iptest".
r1990 run_iptest()
Fernando Perez
Let iptest pass arguments correctly to nose (in-process or in subprocess)....
r2480 else:
Fernando Perez
Make it possible to run the tests from the source dir without installation....
r2481 # This starts subprocesses
Fernando Perez
Let iptest pass arguments correctly to nose (in-process or in subprocess)....
r2480 run_iptestall()
Brian Granger
Refactored iptest to include the iptestall capabilities....
r1972
if __name__ == '__main__':
Fernando Perez
Small fixes for wx-dependent tests and include clearcmd....
r2091 main()