discover (original) (raw)

This is the test discovery mechanism and load_tests protocol for unittest backported from Python 2.7 to work with Python 2.4 or more recent (including Python 3).

discover can be installed with pip or easy_install. After installing switch the current directory to the top level directory of your project and run:

python -m discover python discover.py

(If you have setuptools or distributeinstalled you will also have a discover script available.)

This will discover all tests (with certain restrictions) from the current directory. The discover module has several options to control its behavior (full usage options are displayed with python -m discover -h):

Usage: discover.py [options]

Options: -v, --verbose Verbose output -s directory Directory to start discovery ('.' default) -p pattern Pattern to match test files ('test*.py' default) -t directory Top level directory of project (default to start directory)

For test discovery all test modules must be importable from the top level directory of the project.

For example to use a different pattern for matching test modules run:

python -m discover -p '*test.py'

(For UNIX-like shells like Bash you need to put quotes around the test pattern or the shell will attempt to expand the pattern instead of passing it through to discover. On Windows you must not put quotes around the pattern as the Windows shell will pass the quotes to discover as well.)

Test discovery is implemented in discover.DiscoveringTestLoader.discover. As well as using discover as a command line script you can importDiscoveringTestLoader, which is a subclass of unittest.TestLoader, and use it in your test framework.

This method finds and returns all test modules from the specified start directory, recursing into subdirectories to find them. Only test files that match pattern will be loaded. (Using shell style pattern matching.)

All test modules must be importable from the top level of the project. If the start directory is not the top level directory then the top level directory must be specified separately.

The load_tests protocol allows test modules and packages to customize how they are loaded. This is implemented indiscover.DiscoveringTestLoader.loadTestsFromModule. If a test module defines a load_tests function then tests are loaded from the module by callingload_tests with three arguments: loader, standard_tests, None.

If a test package name (directory with __init__.py) matches the pattern then the package will be checked for a load_testsfunction. If this exists then it will be called with loader, tests,pattern.

If load_tests exists then discovery does not recurse into the package,load_tests is responsible for loading all tests in the package.

The pattern is deliberately not stored as a loader attribute so that packages can continue discovery themselves. top_level_dir is stored soload_tests does not need to pass this argument in toloader.discover().

discover.py is maintained in a google code project (where bugs and feature requests should be posted): http://code.google.com/p/unittest-ext/

The latest development version of discover.py can be found at:http://code.google.com/p/unittest-ext/source/browse/trunk/discover.py

CHANGELOG

2010/06/11 0.4.0

Feature parity with the TestLoader in Python 2.7 RC 1.

2010/02/07 0.3.2

2009/09/13 0.3.1

2009/08/20 0.3.0