[Distutils] RFC: Standard Declaration of tests in eggs

Phillip J. Eby pje at telecommunity.com
Fri Jan 5 18:35:22 CET 2007

At 12:24 PM 1/5/2007 -0500, Jim Fulton wrote:
>Phillip J. Eby wrote:
>>At 08:46 AM 1/5/2007 -0500, Jim Fulton wrote:
>>>2. An optional 'tests' extra is defined.  When creating test runners
>>>     or dynamically loading distributions to load tests, any
>>>     distributions listed in extra requires for the 'tests' extra shall
>>>     be included in the working set for the test runner.
>>Point #2 is unnecessary, since individual entry points can list extras in 
>>square brackets following the module/attribute information.  When loading 
>>an entry point, these extras automatically get require()'d.
>>Conversely, if the test runner wants to manage the loading process, it 
>>can simply inspect the entry point object to determine the names of the extras.
>Ah, good point.  Man, setuptools is soooooo rich.

Rich requirements make rich design.  See my recent "Where Zope Leads, 
Python Follows" blog post.  :)

>Why can't an entry point invoke a test loader itself?
>This seems much simpler and more straightforward to me.

Because that requires you to write code for something that can adequately 
be expressed through an existing configuration mechanism.  *And* you have 
to write that code in every project.

If you're using setuptools' ScanningLoader (which is the default for the 
"test" command, and which I believe should be the default for this proposal 
as well), you automatically get all TestCase subclasses in all submodules 
of the package you target, and if any module has an 'additional_tests()' 
function, it's called to get a suite that's added in.  This lets you just 
make your entry point a "whatever.tests" package, without writing any extra 
code (unless you want to throw in some doctests via a few 
'additional_tests()' functions).

See the setuptools documentation for the 'test_suite' and 'test_loader' 
arguments to setup() for the full details.

Oh, and the 'nose' package is a unittest-compatible extended testing 
framework that is designed to also work as a 'test_loader' for 
setuptools.  So, between ScanningLoader and 'nose', that would be two 
already-existing ways of specifying tests that would work with the new 
proposal, if you could specify a loader entry point.  And it would be good 
if the default loader was compatible with ScanningLoader's test discovery 

(I'm not sure if nose really works with eggs, though; ScanningLoader will 
discover tests in eggs as long as the source is included, but nose may be 
strictly file-based for all I know.  Changing it probably wouldn't be too 
difficult, however.)

More information about the Distutils-SIG mailing list