[Numpy-svn] r3725 - in trunk/numpy: . testing
numpy-svn at scipy.org
numpy-svn at scipy.org
Sun Apr 22 17:18:22 EDT 2007
Author: cookedm
Date: 2007-04-22 16:18:20 -0500 (Sun, 22 Apr 2007)
New Revision: 3725
Modified:
trunk/numpy/__init__.py
trunk/numpy/testing/numpytest.py
Log:
NumpyTest.test() takes an extra argument, all, which, if true, makes
it act like NumpyTest.testall(). This comes from some refactoring to remove
duplicate code in .test and .testall().
Modified: trunk/numpy/__init__.py
===================================================================
--- trunk/numpy/__init__.py 2007-04-22 21:12:57 UTC (rev 3724)
+++ trunk/numpy/__init__.py 2007-04-22 21:18:20 UTC (rev 3725)
@@ -84,11 +84,8 @@
testing --> NumpyTest
"""
- def test(level=1, verbosity=1):
- if level <= 10:
- return NumpyTest().test(level, verbosity)
- else:
- return NumpyTest().testall(level, verbosity)
+ def test(*args, **kw):
+ return NumpyTest().test(*args, **kw)
test.__doc__ = NumpyTest.test.__doc__
import add_newdocs
Modified: trunk/numpy/testing/numpytest.py
===================================================================
--- trunk/numpy/testing/numpytest.py 2007-04-22 21:12:57 UTC (rev 3724)
+++ trunk/numpy/testing/numpytest.py 2007-04-22 21:18:20 UTC (rev 3725)
@@ -11,7 +11,7 @@
__all__ = ['set_package_path', 'set_local_path', 'restore_path',
'IgnoreException', 'NumpyTestCase', 'NumpyTest',
'ScipyTestCase', 'ScipyTest', # for backward compatibility
- 'importall'
+ 'importall',
]
DEBUG=0
@@ -338,7 +338,7 @@
short_module_name = self._rename_map.get(short_module_name,short_module_name)
return short_module_name
- def _get_module_tests(self,module,level,verbosity):
+ def _get_module_tests(self, module, level, verbosity):
mstr = self._module_str
short_module_name = self._get_short_module_name(module)
@@ -395,9 +395,8 @@
def _get_suite_list(self, test_module, level, module_name='__main__',
verbosity=1):
- mstr = self._module_str
suite_list = []
- if hasattr(test_module,'test_suite'):
+ if hasattr(test_module, 'test_suite'):
suite_list.extend(test_module.test_suite(level)._tests)
for name in dir(test_module):
obj = getattr(test_module, name)
@@ -410,44 +409,14 @@
if getattr(suite,'isrunnable',lambda mthname:1)(mthname):
suite_list.append(suite)
if verbosity>=0:
- self.info(' Found %s tests for %s' % (len(suite_list),module_name))
+ self.info(' Found %s tests for %s' % (len(suite_list), module_name))
return suite_list
- def test(self,level=1,verbosity=1):
- """ Run Numpy module test suite with level and verbosity.
-
- level:
- None --- do nothing, return None
- < 0 --- scan for tests of level=abs(level),
- don't run them, return TestSuite-list
- > 0 --- scan for tests of level, run them,
- return TestRunner
-
- verbosity:
- >= 0 --- show information messages
- > 1 --- show warnings on missing tests
-
- It is assumed that package tests suite follows the following
- convention: for each package module, there exists file
- <packagepath>/tests/test_<modulename>.py that defines
- TestCase classes (with names having prefix 'test_') with methods
- (with names having prefixes 'check_' or 'bench_'); each of
- these methods are called when running unit tests.
- """
- if level is None: # Do nothing.
- return
-
- if isinstance(self.package, str):
- exec 'import %s as this_package' % (self.package)
- else:
- this_package = self.package
-
+ def _test_suite_from_modules(self, this_package, level, verbosity):
package_name = this_package.__name__
-
modules = []
for name, module in sys.modules.items():
- if package_name != name[:len(package_name)] \
- or module is None:
+ if not name.startswith(package_name) or module is None:
continue
if not hasattr(module,'__file__'):
continue
@@ -465,59 +434,18 @@
suites.extend(self._get_suite_list(sys.modules[package_name],
abs(level), verbosity=verbosity))
+ return unittest.TestSuite(suites)
- all_tests = unittest.TestSuite(suites)
- if level<0:
- return all_tests
-
- runner = unittest.TextTestRunner(verbosity=verbosity)
- # Use the builtin displayhook. If the tests are being run
- # under IPython (for instance), any doctest test suites will
- # fail otherwise.
- old_displayhook = sys.displayhook
- sys.displayhook = sys.__displayhook__
- try:
- runner.run(all_tests)
- finally:
- sys.displayhook = old_displayhook
- return runner
-
- def testall(self,level=1,verbosity=1):
- """ Run Numpy module test suite with level and verbosity.
-
- level:
- None --- do nothing, return None
- < 0 --- scan for tests of level=abs(level),
- don't run them, return TestSuite-list
- > 0 --- scan for tests of level, run them,
- return TestRunner
-
- verbosity:
- >= 0 --- show information messages
- > 1 --- show warnings on missing tests
-
- Different from .test(..) method, this method looks for
- TestCase classes from all files in <packagedir>/tests/
- directory and no assumptions are made for naming the
- TestCase classes or their methods.
- """
- if level is None: # Do nothing.
- return
-
- if isinstance(self.package, str):
- exec 'import %s as this_package' % (self.package)
- else:
- this_package = self.package
+ def _test_suite_from_all_tests(self, this_package, level, verbosity):
+ importall(this_package)
package_name = this_package.__name__
- importall(this_package)
-
+ # Find all tests/ directories under the package
test_dirs_names = {}
for name, module in sys.modules.items():
- if package_name != name[:len(package_name)] \
- or module is None:
+ if not name.startswith(package_name) or module is None:
continue
- if not hasattr(module,'__file__'):
+ if not hasattr(module, '__file__'):
continue
d = os.path.dirname(module.__file__)
if os.path.basename(d)=='tests':
@@ -532,8 +460,10 @@
test_dirs = test_dirs_names.keys()
test_dirs.sort()
+ # For each file in each tests/ directory with a test case in it,
+ # import the file, and add the test cases to our list
suite_list = []
- testcase_match = re.compile(r'\s*class\s+[_\w]+\s*\(.*TestCase').match
+ testcase_match = re.compile(r'\s*class\s+\w+\s*\(.*TestCase').match
for test_dir in test_dirs:
test_dir_module = test_dirs_names[test_dir]
@@ -547,9 +477,9 @@
f = os.path.join(test_dir, fn)
# check that file contains TestCase class definitions:
- fid = open(f)
+ fid = open(f, 'r')
skip = True
- for line in fid.readlines():
+ for line in fid:
if testcase_match(line):
skip = False
break
@@ -559,31 +489,73 @@
# import the test file
n = test_dir_module + '.' + base
- sys.path.insert(0,test_dir) # in case test files import local modules
+ # in case test files import local modules
+ sys.path.insert(0, test_dir)
+ fo = None
try:
- test_module = imp.load_module(n,
- open(f),
- f,
- ('.py', 'U', 1))
- except Exception, msg:
- print 'Failed importing %s: %s' % (f,msg)
+ try:
+ fo = open(f)
+ test_module = imp.load_module(n, fo, f,
+ ('.py', 'U', 1))
+ except Exception, msg:
+ print 'Failed importing %s: %s' % (f,msg)
+ continue
+ finally:
+ if fo:
+ fo.close()
del sys.path[0]
- continue
- del sys.path[0]
- for name in dir(test_module):
- obj = getattr(test_module, name)
- if type(obj) is not type(unittest.TestCase) \
- or not issubclass(obj, unittest.TestCase) \
- or not self.check_testcase_name(obj.__name__):
- continue
- for mthname in self._get_method_names(obj,abs(level)):
- suite = obj(mthname)
- if getattr(suite,'isrunnable',lambda mthname:1)(mthname):
- suite_list.append(suite)
+ suites = self._get_suite_list(test_module, level,
+ module_name=n,
+ verbosity=verbosity)
+ suite_list.extend(suites)
all_tests = unittest.TestSuite(suite_list)
- if level<0:
+ return all_tests
+
+ def test(self, level=1, verbosity=1, all=False):
+ """Run Numpy module test suite with level and verbosity.
+
+ level:
+ None --- do nothing, return None
+ < 0 --- scan for tests of level=abs(level),
+ don't run them, return TestSuite-list
+ > 0 --- scan for tests of level, run them,
+ return TestRunner
+ > 10 --- run all tests (same as specifying all=True).
+ (backward compatibility).
+
+ verbosity:
+ >= 0 --- show information messages
+ > 1 --- show warnings on missing tests
+
+ all:
+ True --- run all test files (like self.testall())
+ False (default) --- only run test files associated with a module
+
+ It is assumed (when all=False) that package tests suite follows the
+ following convention: for each package module, there exists file
+ <packagepath>/tests/test_<modulename>.py that defines TestCase classes
+ (with names having prefix 'test_') with methods (with names having
+ prefixes 'check_' or 'bench_'); each of these methods are called when
+ running unit tests.
+ """
+ if level is None: # Do nothing.
+ return
+
+ if isinstance(self.package, str):
+ exec 'import %s as this_package' % (self.package)
+ else:
+ this_package = self.package
+
+ if all:
+ all_tests = self._test_suite_from_all_tests(this_package,
+ level, verbosity)
+ else:
+ all_tests = self._test_suite_from_modules(this_package,
+ level, verbosity)
+
+ if level < 0:
return all_tests
runner = unittest.TextTestRunner(verbosity=verbosity)
@@ -598,6 +570,27 @@
sys.displayhook = old_displayhook
return runner
+ def testall(self, level=1,verbosity=1):
+ """ Run Numpy module test suite with level and verbosity.
+
+ level:
+ None --- do nothing, return None
+ < 0 --- scan for tests of level=abs(level),
+ don't run them, return TestSuite-list
+ > 0 --- scan for tests of level, run them,
+ return TestRunner
+
+ verbosity:
+ >= 0 --- show information messages
+ > 1 --- show warnings on missing tests
+
+ Different from .test(..) method, this method looks for
+ TestCase classes from all files in <packagedir>/tests/
+ directory and no assumptions are made for naming the
+ TestCase classes or their methods.
+ """
+ return self.test(level=level, verbosity=verbosity, all=True)
+
def run(self):
""" Run Numpy module test suite with level and verbosity
taken from sys.argv. Requires optparse module.
More information about the Numpy-svn
mailing list