aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPJ Eby <distutils-sig@python.org>2006-03-28 22:40:57 +0000
committerPJ Eby <distutils-sig@python.org>2006-03-28 22:40:57 +0000
commitfb76e7210334ecbadcabfb1549e9df40c138b746 (patch)
tree1f3e6cd64a6063145a55a56415756b01c6190c1e
parentc1294e1d0218322a1e3457897198837a071f2271 (diff)
downloadexternal_python_setuptools-fb76e7210334ecbadcabfb1549e9df40c138b746.tar.gz
external_python_setuptools-fb76e7210334ecbadcabfb1549e9df40c138b746.tar.bz2
external_python_setuptools-fb76e7210334ecbadcabfb1549e9df40c138b746.zip
Enhanced test loader to scan packages as well as modules, and call
``additional_tests()`` if present to get non-unittest tests. --HG-- branch : setuptools extra : convert_revision : svn%3A6015fed2-1504-0410-9fe1-9d1591cc4771/sandbox/trunk/setuptools%4043412
-rwxr-xr-xsetup.py2
-rwxr-xr-xsetuptools.txt31
-rw-r--r--setuptools/command/test.py49
-rw-r--r--setuptools/tests/__init__.py53
4 files changed, 74 insertions, 61 deletions
diff --git a/setup.py b/setup.py
index ca6be4df..5baeacb5 100755
--- a/setup.py
+++ b/setup.py
@@ -37,7 +37,7 @@ setup(
long_description = get_description(),
keywords = "CPAN PyPI distutils eggs package management",
url = "http://peak.telecommunity.com/DevCenter/setuptools",
- test_suite = 'setuptools.tests.test_suite',
+ test_suite = 'setuptools.tests',
packages = find_packages(),
package_data = {'setuptools':['*.exe']},
diff --git a/setuptools.txt b/setuptools.txt
index 9067ccd6..a19aff6c 100755
--- a/setuptools.txt
+++ b/setuptools.txt
@@ -332,9 +332,14 @@ unless you need the associated ``setuptools`` feature.
for more information.
``test_suite``
- A string naming a ``unittest.TestCase`` subclass (or a module containing
- one or more of them, or a method of such a subclass), or naming a function
- that can be called with no arguments and returns a ``unittest.TestSuite``.
+ A string naming a ``unittest.TestCase`` subclass (or a package or module
+ containing one or more of them, or a method of such a subclass), or naming
+ a function that can be called with no arguments and returns a
+ ``unittest.TestSuite``. If the named suite is a module, and the module
+ has an ``additional_tests()`` function, it is called and the results are
+ added to the tests to be run. If the named suite is a package, any
+ submodules and subpackages are recursively added to the overall test suite.
+
Specifying this argument enables use of the `test`_ command to run the
specified test suite, e.g. via ``setup.py test``. See the section on the
`test`_ command below for more details.
@@ -2070,12 +2075,17 @@ up-to-date.
To use this command, your project's tests must be wrapped in a ``unittest``
test suite by either a function, a ``TestCase`` class or method, or a module
-containing ``TestCase`` classes. Note that many test systems including
-``doctest`` support wrapping their non-``unittest`` tests in ``TestSuite``
-objects. So, if you are using a test package that does not support this, we
-suggest you encourage its developers to implement test suite support, as this
-is a convenient and standard way to aggregate a collection of tests to be run
-under a common test harness.
+or package containing ``TestCase`` classes. If the named suite is a module,
+and the module has an ``additional_tests()`` function, it is called and the
+result (which must be a ``unittest.TestSuite``) is added to the tests to be
+run. If the named suite is a package, any submodules and subpackages are
+recursively added to the overall test suite.
+
+Note that many test systems including ``doctest`` support wrapping their
+non-``unittest`` tests in ``TestSuite`` objects. So, if you are using a test
+package that does not support this, we suggest you encourage its developers to
+implement test suite support, as this is a convenient and standard way to
+aggregate a collection of tests to be run under a common test harness.
By default, tests will be run in the "verbose" mode of the ``unittest``
package's text test runner, but you can get the "quiet" mode (just dots) if
@@ -2349,6 +2359,9 @@ Release Notes/Change History
----------------------------
0.6a11
+ * Enhanced test loader to scan packages as well as modules, and call
+ ``additional_tests()`` if present to get non-unittest tests.
+
* Support namespace packages in conjunction with system packagers, by omitting
the installation of any ``__init__.py`` files for namespace packages, and
adding a special ``.pth`` file to create a working package in
diff --git a/setuptools/command/test.py b/setuptools/command/test.py
index 31f1ae40..30226866 100644
--- a/setuptools/command/test.py
+++ b/setuptools/command/test.py
@@ -2,6 +2,42 @@ from setuptools import Command
from distutils.errors import DistutilsOptionError
import sys
from pkg_resources import *
+from unittest import TestLoader, main
+
+class ScanningLoader(TestLoader):
+
+ def loadTestsFromModule(self, module):
+ """Return a suite of all tests cases contained in the given module
+
+ If the module is a package, load tests from all the modules in it.
+ If the module has an ``additional_tests`` function, call it and add
+ the return value to the tests.
+ """
+
+ tests = [TestLoader.loadTestsFromModule(self,module)]
+
+ if hasattr(module, "additional_tests"):
+ tests.append(module.additional_tests())
+
+ if hasattr(module, '__path__'):
+ for file in resource_listdir(module.__name__, ''):
+ if file.endswith('.py') and file!='__init__.py':
+ submodule = module.__name__+'.'+file[:-3]
+ else:
+ if resource_exists(
+ module.__name__, file+'/__init__.py'
+ ):
+ submodule = module.__name__+'.'+file
+ else:
+ continue
+ tests.append(self.loadTestsFromName(submodule))
+
+ if len(tests)>1:
+ return self.suiteClass(tests)
+ else:
+ return tests[0] # don't create a nested suite for only one return
+
+
class test(Command):
@@ -39,6 +75,11 @@ class test(Command):
if self.verbose:
self.test_args.insert(0,'--verbose')
+
+
+
+
+
def run(self):
# Ensure metadata is up-to-date
self.run_command('egg_info')
@@ -70,10 +111,10 @@ class test(Command):
dist = Distribution(path_item, metadata, project_name=ei_cmd.egg_name)
working_set.add(dist)
require(str(dist.as_requirement()))
- unittest.main(None, None, [unittest.__file__]+self.test_args)
-
-
-
+ unittest.main(
+ None, None, [unittest.__file__]+self.test_args,
+ testLoader = ScanningLoader()
+ )
diff --git a/setuptools/tests/__init__.py b/setuptools/tests/__init__.py
index 7009b321..ea469446 100644
--- a/setuptools/tests/__init__.py
+++ b/setuptools/tests/__init__.py
@@ -13,6 +13,12 @@ from distutils.version import StrictVersion, LooseVersion
from distutils.util import convert_path
import sys, os.path
+def additional_tests():
+ import doctest
+ return doctest.DocFileSuite(
+ 'api_tests.txt', optionflags=doctest.ELLIPSIS, package='pkg_resources',
+ )
+
def makeSetup(**args):
"""Return distribution from 'setup(**args)', without executing commands"""
@@ -33,12 +39,6 @@ def makeSetup(**args):
-
-
-
-
-
-
class DependsTests(TestCase):
def testExtractConst(self):
@@ -367,44 +367,3 @@ class TestCommandTests(TestCase):
-def test_api():
- import doctest
- return doctest.DocFileSuite(
- 'api_tests.txt', optionflags=doctest.ELLIPSIS, package='pkg_resources',
- )
-
-
-testClasses = (DependsTests, DistroTests, FeatureTests, TestCommandTests)
-testNames = ["setuptools.tests.test_resources", "setuptools.tests.test_api"]
-
-def test_suite():
- return TestSuite(
- [makeSuite(t,'test') for t in testClasses]+
- [defaultTestLoader.loadTestsFromName(n) for n in testNames]
- )
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-